【发布时间】:2016-03-31 21:32:33
【问题描述】:
我是 Prolog 的新手,我被分配了这个任务。
我的代码如下:
relatives(cindy,tanya).
relatives(tanya,alan).
relatives(alan,mike).
relatives(kerry,jay).
relatives(jay,alan).
isRelated(X,Y):-
relatives(X,Y).
isRelated(X,Y):-
relatives(X,Z),
isRelated(Z,Y).
足够简单。这表明如果:
?- isRelated(cindy,mike).
Prolog 将返回 true。现在,如果:
?- isRelated(mike,cindy).
我一直在尝试想出一些想法,比如如果 isRelated(Z,Y) 返回 false,然后切换 X 和 Y,然后再次运行 isRelated。但我不确定 Prolog 是否允许这样的想法。任何提示或建议将不胜感激。谢谢!
更新:************************************
所以我补充说:
isRelated(X,Y):-
relatives(X,Y);
relatives(Y,X).
这将满足“直接”关系,但很简单,我发现它不满足间接关系。
我真的想做一些类似的事情,如果初始查询:
isRelated(mike,cindy)
失败,然后通过切换X和Y尝试看看是否相反:
isRelated(cindy,mike)
那肯定会返回 true。我只是不知道如何在 Prolog 的语法上做到这一点。
【问题讨论】:
-
提示问题:如果
relatives(Y,X)成立,X和Y是否相关? -
是的,这是为了家庭作业。我绝对不是这个网站的新手,所以我知道不要寻求可能会给出太多答案的具体建议。我已经用 C/Java 编程 2 年了,但我最近才开始使用 Prolog。这绝对是一种完全不同的动物。
-
我在您的问题中添加了“作业”标签,这就是我问的原因。 :) 祝你驯服 Prolog 好运,尤其是。推荐“序言的艺术”。当您到达差异列表时,请跳过所有炒作,只需记住:它只是开放式列表,结束指针明确保留在手边,因此可以在需要时进行设置。也可以将 logvars 视为命名指针,它只能设置一次(在回溯之前)。干杯。
标签: recursion prolog transitive-closure