我刚刚开始学习prolog,并对递归的工作原理感到困惑。我写了这段代码:
test(X,B):- B is X + 2, B < 22, test(B,_).
test(X,Y).
我希望它返回20或21,但相反,如果我打电话,比如说,测试(4,X)它会一遍又一遍地返回6(确切地说是7次),如下所示:
X = 6 ;
X = 6 ;
X = 6 ;
...
等。所以我想知道我做错了什么。在此先感谢您的帮助!真的很感激。
答案 0 :(得分:2)
你误解了你得到的结果,看:
?- test(4,X). X = 6 ; X = 6 ; X = 6 ; X = 6 ; X = 6 ; X = 6 ; X = 6 ; X = 6 ; true. % <====
注意最后的true
,表示:是的,任何 X
都是如此!
以下是您可能要编写的内容 - 尝试模拟您的确切表达方式:
mtest(X0, X) :-
X1 is X0+2,
X1 < 22,
mtest(X1, X).
mtest(X0, X) :-
X is X0,
X+2 >= 22.
有些事情很了不起:
注意第一个子句中的变量X
:它“反对”结果。
第二个句子需要表达与第一个子句中给出的条件相反的条件,因为子句是相互独立的。在你的原始程序中,事实test(X,Y).
表明这种关系对于一切都是正确的! (你得到了警告,不是吗?)例如,test(7,1000).
也成功了。
X is X0
用于确保第二个参数只是一个数字而不是表达式。
无论如何,作为初学者,请尝试使用library(clpfd)
,clpfd代替(is)/2
。或者甚至更好,从successor-arithmetics开始。