prolog中的冻结目标

prolog中的冻结目标,prolog,primes,sieve-of-eratosthenes,prolog-coroutining,Prolog,Primes,Sieve Of Eratosthenes,Prolog Coroutining,我想冻结我的目标,直到某个变量,例如list,是无界的,现在我有了 sieve(N,L) :- freeze(Aux,sieve(N,L,[],Aux)), numlist(2,N,Aux). sieve(N,L,R,[H|T]) :- freeze(X, X mod H =\= 0 ; X == H), findall(X,select(X,T,_),P), sieve(N,L,[H|R],P). sieve(_,L,L,[]). 但它会在一些操作后停止,并永

我想冻结我的目标,直到某个变量,例如list,是无界的,现在我有了

sieve(N,L) :-
   freeze(Aux,sieve(N,L,[],Aux)),
   numlist(2,N,Aux).

sieve(N,L,R,[H|T]) :-
   freeze(X, X mod H =\= 0 ; X == H),
   findall(X,select(X,T,_),P),
   sieve(N,L,[H|R],P).
sieve(_,L,L,[]).

但它会在一些操作后停止,并永远等待。有人能告诉我如何纠正这个问题吗?

好的,我找到了解决方案,我必须在
sieve
中更改递归调用,所以现在我在freeze谓词中调用它

应要求 我在这里找到了线索


检查此代码以查看它是否有助于您它不,它不关于筛选它关于
冻结
sieve(N,L) :-
    sieve(L,Strumien,[]),
    numlist(2,N,X),
    X = Strumien.

sieve(L,Strumien,X) :-
    freeze(Strumien,
        (   Strumien =[H|T],
            filter(H,T,Z),
            sieve(L,Z,[H|X])
        )).
sieve(L,[],L).

filter(H,S,X) :-
    filter(H,S,X,[]).

filter(_,[],X,X).
filter(H,S,X,Y) :-
    freeze(S,S =[H1|T]),
    ( H1 mod H =\= 0 ->
        append(Y,[H1],Y2),
        filter(H,T,X,Y2)
    ;
        filter(H,T,X,Y)
    ).