qwe*_*rty 2 prolog successor-arithmetics
我在理解此示例中发生的事情时遇到了麻烦
立即学习 Prolog -第 3 章- 示例 3:后继
numeral(0).
numeral(succ(X)) :- numeral(X).
Run Code Online (Sandbox Code Playgroud)
当询问number(X)时,它首先给X赋值0,然后继续succ(0),以这种方式将succ(0)部分加1,直到它用完空间:
X = 0 ?
X = succ(0) ? ;
X = succ(succ(0)) ? ;
X = succ(succ(succ(0))) ? ;
X = succ(succ(succ(succ(0)))) ?
Run Code Online (Sandbox Code Playgroud)
我很难理解为什么它会增加 succ(0)?
我知道 prolog 会首先找到一个事实并匹配它,因此是第一个 0。然后它会回溯看看是否有任何其他解决方案,它会“看到”规则。在规则中,它将使用实例化的 X 到 0。我失败的地方是看它为什么不断增加 succ(0)。X 是否变为 succ(0),而不仅仅是 0?
我为愚蠢的大脑道歉。
我认为 Guy Coder 对正在发生的事情进行了很好的详细解释。我将提供他的归纳解释的一个轻微变体,希望有助于带来更多的清晰度。
想想你的 Prolog 规则怎么说:
numeral(0).
Run Code Online (Sandbox Code Playgroud)
这就是说,0 是一个数字。
numeral(succ(X)) :- numeral(X).
Run Code Online (Sandbox Code Playgroud)
这表示,如果是succ(X)数字,则 X是数字。
根据第一条规则,那么,0是一个数字。也就是说,numeral(0)是真的(成功)。根据第二条规则,既然0是数字,那么succ(0)一定是数字(numeral(succ(0))为真)。既然succ(0)是数字,那么再根据第二条规则,succ(succ(0))一定是数字(numeral(succ(succ(0))为真)。等等...
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |