相关疑难解决方法(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
查看次数

CLP(FD)和dif/2中的重复约束

在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 clpfd

5
推荐指数
0
解决办法
183
查看次数

如何在Prolog中表示直接访问邻居verticies的有向循环图

我需要在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->[]]

但是如何在搜索邻居时避免在列表上调用函数"成员",这会花费线性时间?

谢谢你的帮助

prolog cyclic-graph

4
推荐指数
3
解决办法
1210
查看次数