[英]SWI-Prolog: How to stop the predicate when the list is empty? (predicate included)
[英]how iterate on an empty input in prolog?
我想知道是否有任何方法可以在 Prolog 中通过空输入实现迭代。 例如,我希望第一次迭代为 0,下一次迭代为 1,第二次迭代为 2,依此类推。
incrementing(Lower, Increment, N) :-
integer(Lower),
integer(Increment),
Increment @>= 1,
( nonvar(N) ->
integer(N),
% Fast integer comparison
N @>= Lower,
% No more than 1 possible answer
incrementing_nonvar_(Lower, Increment, N)
; incrementing_var_(Lower, Increment, N)
).
incrementing_nonvar_(Lower, Increment, N) :-
% Can calculate, faster than iterating
Diff is N - Lower,
divmod(Diff, Increment, _, 0).
incrementing_var_(Lower, _Increment, Lower).
incrementing_var_(Lower, Increment, N) :-
Lower1 is Lower + Increment,
incrementing_var_(Lower1, Increment, N).
结果 swi-prolog:
?- incrementing(5, 3, N).
N = 5 ;
N = 8 ;
N = 11 ;
N = 14 ...
?- incrementing(5, 3, 11).
true.
?- incrementing(5, 3, 12).
false.
为了方便起见,可以包装一下,例如:
iterate(N) :-
incrementing(0, 1, N).
结果:
?- iterate(-1).
false.
?- iterate(2).
true.
?- iterate(N).
N = 0 ;
N = 1 ;
N = 2 ;
N = 3 ...
使用succ/2
:
nat(N) :-
nat(0, N).
nat(N, N).
nat(N0, N) :-
succ(N0, N1),
nat(N1, N).
或使用call_nth/2
:
nat(0).
nat(N) :-
call_nth(repeat, N).
现在,所有自然数:
?- nat(N).
示例: iterate() 是我的查询,每次我调用它时,我希望 output 第一次为 0,第二次为 0,依此类推。
如果您将 state 存储在 Prolog 数据库中,并且不介意 output 有副作用并且可以在调用时处理不使用 () 的情况,则:
:- dynamic(iterate_counter/1).
iterate_counter(0).
iterate() :-
iterate_counter(X),
writeln(X),
succ(X, Y),
retract(iterate_counter(X)),
assert(iterate_counter(Y)).
?- iterate, iterate, iterate.
0
1
2
从您的评论中:
示例:
iterate()
是我的查询,每次我调用它时,我希望 output 第一次为 0,第二次为 0,依此类推。
应该不会比这更困难:
increment(N) :- inc(0,1,N).
inc(C , _ , C ) .
inc(C , S , N ) :- C1 is C+S, inc(C1,S,N).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.