prolog - 关系运算符在序言中用于变量

标签 prolog clpfd

我正在编写以下代码并给出了完美的结果。

edge(s,a,300).
edge(s,d,20).
edge(a,d,400).
edge(a,b,1500).
edge(b,c,9).
edge(b,e,200).
edge(c,d,2000).
edge(c,g,12).
edge(d,e,3).
edge(e,f,400).
edge(f,g,800).

connected(X,Y,D) :- edge(X,Y,D) ; edge(Y,X,D).

path(A,B,D,Path) :- 
    travel(A,B,D,[A],Q),
    reverse(Q,Path).

travel(A,B,D,P,[B|P]) :-
    connected(A,B,D).

travel(A,B,D,Visited,Path) :-
    connected(A,X,D1),
    X \== B,
    \+member(X,Visited),
    D2 is D - D1,
    travel(X,B,D2,[X|Visited],Path).

如果我在这里查询

| ?- path(s,e,23,P).
P = [s,d,e] ? ;
no
| ?-

我确实得到了正确的回应。 但是不,我希望得到 D<50 的结果,比方说。 怎么办?

最佳答案

算术表达式在 Prolog 中是一种特殊情况,不希望与未绑定(bind)参数一起使用,因此您不能简单地请求 path(s,e,D,P), D < 50 ,因为 is -clause 需要实例化其所有右侧参数。

您可以使用 finite domain (FD) constraint extensions对于 Prolog(例如在 GNU Prolog 中):只需更改您的 is相当于 FD #= ,然后问:

/Users/stolz/test.pl compiled, 27 lines read - 3180 bytes written, 8 ms
| ?- fd_domain(D,0,50), path(s,e,D,P).

D = 23
P = [s,d,e] ? ;

no

关于prolog - 关系运算符在序言中用于变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13245200/

相关文章:

prolog - 求所有以数字为极限的立方根

prolog - 序言中的递归乘法

prolog - 解决序言中的链式 react

prolog - HiLog 是否添加了 Prolog 中 "call"无法完成的任何内容?

prolog - different/2-是否存在纯粹的确定性定义?

prolog - 使用 Prolog 查找组合而不是对的排列

prolog - 运算符(operator)预期错误-前言

prolog - 我怎样才能从这段代码中删除回溯?

prolog - 如何在 Prolog 中添加多项式?

git - 如何在 Gerrit prolog 中获得特定审阅者投票而不是通过 Rest api?