我想知道是否有人可以帮我解决这个问题:我必须使用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)
我已经证明了我制作的节目并且有效!但我不知道是否有可能提高效率,如果是,我怎么能这样做(我在这里阅读这个旧线程).我应该添加或修改任何约束吗?
谢谢!
我写了这个简单的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实现?