[英]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.