Prolog:为什么这个循环不起作用?

时间:2015-05-07 18:46:56

标签: loops recursion prolog

我刚刚开始学习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 ;
...

等。所以我想知道我做错了什么。在此先感谢您的帮助!真的很感激。

1 个答案:

答案 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)代替(is)/2。或者甚至更好,从开始。