簡體   English   中英

如何迭代 prolog 中的空輸入?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM