所以我试图从Prolog中找出一些东西,但我不确定为什么我得到的结果是我得到的。鉴于这个定义:
families(_, Smith, lucy, _, jeff, Smith).
和这个查询:
?- families(Ford, nancy, Ford, jeff, Smith, White).
为什么这是结果?:
Ford = lucy,
Smith = jeff,
White = nancy.
谢谢!
答案 0 :(得分:3)
(注意:开场后和结束括号前不需要留空格。另外,如果这是作业,你应该这样说。)
families/6
的定义,
families(_, Smith, lucy, _, jeff, Smith).
表示:
lucy
; jeff
统一第五个参数。现在您的查询,
?- families(Ford, nancy, Ford, jeff, Smith, White).
问:
Ford = lucy
(来自定义中的3.)。nancy
吗?
White = nancy
(来自定义中的2.)jeff
吗?
Smith = jeff
(定义中的4.)。现在应该清楚,假设你知道统一是如何运作的。重要的是定义和查询中的变量名称位于不同的上下文中,并且具有相同的名称意味着什么(如在定义中的位置2和6中的 Smith 和 Smith 在查询中的第5位。)
总而言之,这是一个复杂的例子,它使用变量和原子名称来试图混淆人类读者。它会强迫你注意,并且可以作为糟糕编程风格的一个例子。
答案 1 :(得分:2)
作为the answer by Boris的视觉辅助,我们可以将谓词和查询写在另一个旁边,
families( _ , Smith, lucy, _ , jeff , Smith).
?- families( Ford, nancy, Ford, jeff, Smith, White).
现在,定义中的 Smith
和查询中的 Smith
不相同!每个谓词都有自己的“namespace”,因为谓词的变量是在谓词的使用上重命名的。所以我们实际上在这里
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=A
和 A=nancy
的结果。 A
本身未报告,因为它不是查询的逻辑变量之一。