Замораживание цели в прологе
Я хочу заморозить свою цель, пока какая-то переменная, например, 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,[]).
Но он останавливается после некоторых операций и ждет вечно. Может кто-нибудь сказать мне, как это исправить?
1 ответ
Решение
Хорошо, я нашел решение, я должен был изменить рекурсивный вызов в sieve
так что теперь я называю это в предикате замораживания.
в соответствии с просьбой я нашел здесь подсказку Ленивые списки в Прологе?
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)
).