【问题标题】:Prolog: Understanding logic flowProlog:理解逻辑流程
【发布时间】:2016-12-04 00:40:50
【问题描述】:

我正在阅读Learn Prolog Now!,我对他们对逻辑的使用感到困惑,我希望有人能澄清规则中论点的歧义。

例如,在Chapter 1, knowledge base 4 他们引用以下规则:

loves(vincent,mia).

然后他们提供一个查询:

loves(marsellus,X), woman(X).

然后做出英文声明:

“现在,请记住 , 的意思是“和”,所以这个查询是说:是否有任何个人 X 使得 Marsellus 爱 X 并且 X 是一个女人?” em>

关键字是Marsellus loves X

这样的措辞让我觉得有一些“逻辑”与论点的安排有关,比如说,

loves(vincent,mia).逻辑上”是不是真的意味着:

  1. 文森特喜欢米娅?

但是是假的

  1. 米娅喜欢文森特?

这就是我最初的想法,但后来在Chapter 3, example 2: Descendant 他们有以下示例:

child(bridget,caroline).

然后是英文语句:“即Caroline是Bridget的孩子

但如果上面的#1 是真的(文森特爱米娅),那么这不应该被解读为布里奇特是卡罗琳的孩子吗?

或者参数的顺序无关紧要,是您的额外编程决定了参数的逻辑?

【问题讨论】:

  • 谓词 r(a,b) 表示 (a,b) 处于关系 r:A->B 中。没有更多的暗示。所以一切都取决于你如何定义关系 r。

标签: prolog


【解决方案1】:

loves(X, Y) 直观上意味着X 喜欢Y,但不是Y 喜欢X。但是作为程序员,您可以假设它是对称的。它只是不那么直观。这仅取决于您选择如何定义它。 Prolog Now选择了最直观的意思,所以loves(X, Y)表示XY,而不是YX

child(X, Y) 是指 XY 的子代还是 YX 的子代取决于程序员。 child 在此上下文中单独用作事实/谓词的名称在这里有点模棱两可(它不是动词,也不是短语的一部分),您只需要使用 Prolog Now 站点选择的任何内容他们的意义。当您将函子视为动词时,参数会按预期从左到右解释。所以,更好的是使用child_of(X, Y) 来表示XY 的孩子,这样更清楚。

【讨论】:

    【解决方案2】:

    Prolog 作为一种语言不会关心你是否将love(X,Y) 定义为 X 爱 Y 或 Y 爱 X。这可能只是我们倾向于在一阶逻辑中遵循的约定。 至于为什么我们会选择我们通常遵循的排序约定,可能是因为谓词定义了两个术语之间的关系。所以顺序取决于你如何定义关系。

    谓词r(a,b) 表示(a,b) 在关系r:A->B 中。

    我对你在问题中给出的案例的怀疑的方法是:

    loves(a,?) ?应该爱的任何东西。和 child(a,?) ?应该是 a 的子节点。

    这取决于您如何定义关系“孩子”。

    据我所知(不远),逻辑中没有硬性规则可以阻止您按照自己的方式定义谓词。您可以将love(X,Y) 定义为“X 爱 Y”或“X 被 Y 爱”,只要您保持一致即可。

    【讨论】:

    • 好吧,书中描述了一个实际的约定,如果可能的话,p(X,Y) 应该真正表示“X p Y”。 r:A->B 更像是函数的符号,而不是关系。 :)
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多