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