prolog - 在序言中卡住目标

标签 prolog primes sieve-of-eratosthenes prolog-coroutining

我想卡住我的目标,直到某些变量(例如列表)是无界的,现在我有

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 中更改递归调用所以现在我在卡住谓词中调用它。

按照要求
我在这里找到了线索 Lazy lists in Prolog?

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)
    ).

关于prolog - 在序言中卡住目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30726836/

相关文章:

python - 寻找数的最大质因数的有效方法

c# - 找到给定数字以内的所有素数的最佳、性能最好的算法是什么?

java - GUI 可以并行检查大量数据的原始性

使用L1 CPU Cache的c++算法的Python实现

performance - Haskell 中的埃拉托斯特尼筛法执行时间

Prolog - WAM 的高级目的

java - JPL7,序言查询中的字符串列表

c++ - 超长冗余代码高效吗?

prolog - 显示给定Prolog程序的WAM代码

prolog - 为 L0 程序术语生成 WAM 代码的正确顺序是什么?