相关疑难解决方法(0)

使用约束逻辑编程排序列表

我想知道是否有人可以帮我解决这个问题:我必须使用Prolog与Constraing Logic Programming订购一个列表,我必须以更有效的方式来做.

所以我定义的主要谓词是下一个:

order(Xs,Ys) :-
    same_length(Xs,Ys),      /* To determine the list Ys with the Xs' length */
    perm(Xs,Ys),             /* Permutation */
    ordered(Ys),             /* Is Ys ordered? */
    ! .
Run Code Online (Sandbox Code Playgroud)

每个先前辅助谓词的实现如下:

same_length(Xs,Ys) :-
    length(Xs,L),
    length(Ys,L).

perm([],[]).
perm([X|Xs],Ys) :- elem(X,Ys,Ws), perm(Xs,Ws).

ordered([]).
ordered([_]).
ordered([X,Y|Xs]) :- X =< Y, ordered([Y|Xs]).

elem(X,[X|Ys],Ys).
elem(X,[Y|Ws],[Y|Zs]) :- elem(X,Ws,Zs).
Run Code Online (Sandbox Code Playgroud)

我已经证明了我制作的节目并且有效!但我不知道是否有可能提高效率,如果是,我怎么能这样做(我在这里阅读这个旧线程).我应该添加或修改任何约束吗?

谢谢!

list prolog constraint-programming

9
推荐指数
1
解决办法
1094
查看次数

为什么循环引用和递归使我的程序失败?

我写了这个简单的Prolog程序.

man(socrates).
mortal(X) :- man(X).
immortal(X) :- immortal(X).
Run Code Online (Sandbox Code Playgroud)

我问过常见的问题,比如苏格拉底是男人还是苏格拉底是凡人.

?- man(socrates).
true.                    //we know for a fact that Socrates is a man
?- mortal(socrates).
true.                    //and it can logically be inferred that Socrates is mortal
?- immortal(socrates).
                         //but we can't seem to figure out if he's immortal
Run Code Online (Sandbox Code Playgroud)

由于递归定义,它崩溃了immortal.循环引用也会使其崩溃或出错Out of stack space.

在我看来,至少在这种情况下,Prolog先生得出的结论是,根据该计划的规则,不能推断苏格拉底是不朽的,这是相当微不足道的.怎么样?我想它可以检查堆栈并查看它是否遍历已经遍历的规则.

有没有原因尚未实施?这样做是否有问题我可以忽略,或者是否已经执行此类分析的Prolog实现?

recursion prolog infinite-loop circular-reference

3
推荐指数
1
解决办法
1109
查看次数