我想知道是否有人可以帮我解决这个问题:我必须使用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)
我已经证明了我制作的节目并且有效!但我不知道是否有可能提高效率,如果是,我怎么能这样做(我在这里阅读这个旧线程).我应该添加或修改任何约束吗?
谢谢!
在SWI-Prolog中,以下查询给出了以下结果:
?- X mod 2 #= 0, X mod 2 #= 0.
X mod 2#=0,
X mod 2#=0.
Run Code Online (Sandbox Code Playgroud)
虽然正确,但显然不需要第二个约束
同理:
?- dif(X,0), dif(X,0).
dif(X, 0),
dif(X, 0).
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种重复约束?(显然,最正确的方法是不编写导致这种情况的代码,但并不总是那么容易).
我需要在Prolog中使用循环构建有向图(在运行时),我不知道如何表示它.我的要求是我需要在一个恒定的时间内从一个顶点到达他的邻居.
是否可以将其表示为树,例如:
t(left_son,V,right_son)
但如何解决周期?
我可以列出边缘列表:
graph([a,b,c,d],[e(a,b),e(b,c),e(c,a),e(c,d)])
要不就
[a->[b],b->[c],c->[a,d],d->[]] 但是如何在搜索邻居时避免在列表上调用函数"成员",这会花费线性时间?
谢谢你的帮助