首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Prolog获得唯一的结果

用Prolog获得唯一的结果
EN

Stack Overflow用户
提问于 2015-02-01 20:29:08
回答 2查看 5.7K关注 0票数 1

我有一个返回:[[vincent,vincent],[vincent,marcellus],[marcellus,vincent],[marcellus,marcellus],[pumpkin,pumpkin],[honey_bunny,honey_bunny]]的Prolog代码。

代码语言:javascript
复制
:- initialization main.

loves(vincent, mia).
loves(marcellus, mia).
loves(pumpkin, honey_bunny).
loves(honey_bunny, pumpkin).

jealous(X, Y) :-
    loves(X, Z),
    loves(Y, Z).

main :- 
    findall([X, Y], jealous(X, Y), L),
    write(L),
    halt.

当X= Y时,如何得到唯一的结果?我尝试了下面的代码以获得与以前相同的结果。

代码语言:javascript
复制
jealous(X, Y) :-
    X \== Y,
    loves(X, Z),
    loves(Y, Z).

\=在一起,我得到了[]。结果如何只获得[vincent,marcellus]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-01 22:06:22

你尝试的解决方案中的目标顺序是错误的。当用两个不同的变量调用时,(\==)/2标准谓词总是成功的。解决方案是,只有在实例化谓词的参数时才调用它:

代码语言:javascript
复制
jealous(X, Y) :-
    loves(X, Z),
    loves(Y, Z),
    X \== Y.

使用此修补程序,您的查询现在返回:

代码语言:javascript
复制
?- findall([X, Y], jealous(X, Y), L).
L = [[vincent, marcellus], [marcellus, vincent]].

所以,没人再嫉妒自己了。但你还是有多余的解决方案。我们可以修改jealous/2谓词以对返回的解决方案中的名称进行排序。例如:

代码语言:javascript
复制
jealous(X, Y) :-
    loves(X0, Z),
    loves(Y0, Z),
    X0 \== Y0,
    (   X0 @< Y0 ->
        X = X0, Y = Y0
    ;   X = Y0, Y = X0
    ).

现在,通过使用setof/3而不是findall/3,我们可以得到:

代码语言:javascript
复制
?- setof([X, Y], jealous(X, Y), L).
L = [[marcellus, vincent]].

最后一个观察。列表是表示一对的糟糕的解决方案。传统的方法是使用X-Y(X, Y)

票数 1
EN

Stack Overflow用户

发布于 2015-06-03 03:40:01

只要有可能,就使用dif/2而不是(\==)/2

dif/2将帮助您编写逻辑合理的程序。

有关详细信息,请看prolog-dif

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28267488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档