以下代码是Prolog代码,它给出了大于0的所有整数。每次我将;
放入解释器时,它会给出下一个数字:
is_integer(0).
is_integer(X) :- is_integer(Y),X is Y+1.
有没有办法只给出0到100之间的数字。当它达到100时,它应该停止。
答案 0 :(得分:5)
在B,Ciao,SICStus(库),SWI,YAP,XSB(库)中有一个内置的谓词between/3
。
?- between(0,100,X).
X = 0 ;
X = 1 ;
...
X = 100.
如果您开始学习Prolog,最好先尝试使用s(X)
数字,这些数字更易于理解和推理。同样的例子,但最多只能达到3:
?- nat_nat_sum(N,_,s(s(s(0)))).
定义:
nat_nat_sum(0,I,I).
nat_nat_sum(s(I),J,s(K)) :-
nat_nat_sum(I,J,K).
答案 1 :(得分:2)
这是一个很好的测验。它很好地说明了使用Prolog定义的最小工具来控制递归是多么困难。我们必须将我们的解决方案提交到低于预定义限制的值,从而限制其他无绑定搜索:
is_integer(0).
is_integer(X) :-
is_integer(Y),
( Y >= 100, ! ; X is Y + 1 ).
以下是将范围限制为3(即... Y >= 3, ! ; ...
)
?- is_integer(X).
X = 0 ;
X = 1 ;
X = 2 ;
X = 3 ;
true.