【问题标题】:Prolog Query - Trying to understand how this result happensProlog Query - 试图了解这个结果是如何发生的
【发布时间】:2013-11-25 04:14:46
【问题描述】:

所以我试图从 Prolog 中找出一些东西,但我不确定为什么我会得到我得到的结果。鉴于此定义:

families(_, Smith, lucy, _, jeff, Smith).

这个查询:

?- families(Ford, nancy, Ford, jeff, Smith, White).

为什么会这样?:

Ford = lucy,
Smith = jeff,
White = nancy.

谢谢!

【问题讨论】:

  • 常量(所谓的原子)以小写字母开头。但有些名称以大写字母开头。将这些名称放在引号下。喜欢'Smith'
  • 哦,我不是想得到不同的结果或任何东西。这是一个来自类的旧示例,我们在其中给出了定义和查询,我们假设在纸上找出结果。我输入了它以查看结果是什么,但我不确定为什么会这样。
  • 这并不是说它失败了......“福特 = 露西,史密斯 = 杰夫,怀特 = 南希。”是结果。我把它全部输入到 swipl 来查看结果,但我不确定它为什么会这样。
  • 您的问题中一定有错字。如前所述,您的查询将强制 Smithnancyjeff 统一,这是不可能的。
  • @hardmath 我也失败了一分钟,但谓词中的变量are renamed on use。 :)(...我什至在那儿赞成你的评论):)

标签: prolog


【解决方案1】:

(注意:开括号后和右括号之前不需要留空格。另外,如果这是作业,你应该这样说。)

families/6的定义,

families(_, Smith, lucy, _, jeff, Smith).

说:

  1. 忽略第一个参数和第四个参数(下划线);
  2. 统一第二个和最后一个参数(两个参数都用同一个变量名,Smith);
  3. 将第三个参数与原子lucy统一;
  4. 将第五个参数与原子jeff 统一起来。

现在您的查询,

?- families(Ford, nancy, Ford, jeff, Smith, White).

问:

  • 你能用同一个变量Ford统一第一个和第三个参数吗?
    • 是的,你可以,现在是Ford = lucy(来自定义中的 3.)。
  • 第二个参数可以是原子nancy吗?
    • 是的,White = nancy(来自定义中的 2.)
  • 第四个参数可以是原子jeff吗?
    • 是的,但这没有任何影响(从定义中的 1. 开始)
  • 你能把第五个参数和变量Smith统一起来吗?
    • 是的,Smith = jeff(来自定义中的 4.)。

假设您知道统一的工作原理,现在应该很清楚了。重要的是定义和查询中的变量名称在不同的上下文中,并且具有相同的名称没有任何意义(如 Smith 在定义中的位置 2 和 6 和 Smith在查询中的位置 5)。

总之,这是一个复杂的示例,它使用变量和原子名称来试图混淆人类读者。但它会迫使您注意,并且可以作为不良编程风格的示例。

【讨论】:

  • 太棒了,谢谢。这不是家庭作业,只是考试复习中的一个例子:)
【解决方案2】:

作为the answer by Boris 的视觉辅助,我们可以将谓词和查询并排编写,

   families( _   , Smith, lucy, _   , jeff , Smith).
?- families( Ford, nancy, Ford, jeff, Smith, White).

现在,定义中的 Smith 和查询中的 Smith 相同!每个谓词都有自己的有效“命名空间”,因为谓词的变量在使用谓词时被重命名。所以我们实际上有这里

   families( _   , A    , lucy, _   , jeff , A    ).
?- families( Ford, nancy, Ford, jeff, Smith, White).

匹配,产生替换

_=Ford, A=nancy, lucy=Ford, _=jeff, jeff=Smith, A=White.

Ford=lucy, Smith=jeff, White=nancy.

最后一个是White=AA=nancy的结果。 A 本身没有被报告,因为它不是查询的逻辑变量之一。

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多