【问题标题】:Prolog bidirectional predicateProlog 双向谓词
【发布时间】:2017-11-16 12:02:46
【问题描述】:

我必须在 Prolog 中为一项任务创建家庭关系,我偶然发现了这个问题。

man(john).
woman(lisa).
married(john,lisa).

?- married(john,X).
X = lisa.

?- married(X,john).
false.

如何使这个谓词以两种方式工作? 如果 john 与 lisa 结婚,则 lisa 与 john 结​​婚。

对于事实,我只能使用性别、父母和已婚:

man(john).
woman(lisa).
parent(john,steve).
parent(lisa,steve).
married(john,lisa).

这个要求让我无法使用这个solution。我不能只添加关系wife(lisa,john).,因为我必须自己定义妻子、丈夫等。

wife(X,Y) :- woman(X),married(X,Y).

【问题讨论】:

  • 我不明白您为什么说链接的答案无法使用。虽然它不会在不做任何工作的情况下为您提供问题的完整答案,但此处使用了所需的原则。

标签: prolog predicate bidirectional


【解决方案1】:

您可以相应地定义谓词wife/2,而不是尝试使married/2 双向。如果married/2 的第一个参数始终是丈夫,第二个始终是妻子,则只需翻转第二个目标的参数即可:

wife(X,Y) :-
   woman(X),
   married(Y,X).      % <- changed to Y,X instead of X,Y

根据您给定的事实,这会产生预期的结果:

?- wife(X,Y).
X = lisa,
Y = john.

如果您的事实也包括相反的配对,例如:

woman(ann).
man(anton).
married(ann, anton). 

您也可以包含第二条规则(即您的原始规则),让 Wife/2 也处理此类配对:

wife(X,Y) :-
   woman(X),
   married(Y,X).
wife(X,Y) :-          % <- new rule
   woman(X),          
   married(X,Y). 

有了额外的规则和事实,上面的查询现在产生:

?- wife(X,Y).
X = lisa,
Y = john ;
X = ann,
Y = anton.

【讨论】:

    【解决方案2】:

    如果你不能添加辅助关系(听起来像是家庭作业),尝试使用谓词@&lt;,它在“标准术语顺序”上运行:

    married(A,B) :- A @< B, married(B,A).
    

    但请注意,此解决方案也带来了一些负面影响(请阅读this answer)。

    【讨论】:

    • 在没有任何评论的情况下投票否决这个答案根本没有帮助。请让我们知道出了什么问题...
    • 实际上它有很大帮助,你提到的那些负面方面对我来说并不重要,因为我不需要关于合作伙伴顺序的额外信息:married(john, lisa) 是与已婚(丽莎,约翰)一样满足我的需要。我了解了“标准术语顺序”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多