Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog查询-尝试理解此结果是如何发生的_Prolog - Fatal编程技术网

Prolog查询-尝试理解此结果是如何发生的

Prolog查询-尝试理解此结果是如何发生的,prolog,Prolog,所以我试图从Prolog中找出一些东西,但我不确定为什么我会得到我得到的结果。根据这一定义: families(_, Smith, lucy, _, jeff, Smith). 此查询: ?- families(Ford, nancy, Ford, jeff, Smith, White). 为什么会有这样的结果 Ford = lucy, Smith = jeff, White = nancy. 谢谢大家! (注意:无需在开始括号后和结束括号前留空格。此外,如果这是家庭作业,你应该这样说。)

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

families(_, Smith, lucy, _, jeff, Smith).
此查询:

?- families(Ford, nancy, Ford, jeff, Smith, White).
为什么会有这样的结果

Ford = lucy,
Smith = jeff,
White = nancy.
谢谢大家!

(注意:无需在开始括号后和结束括号前留空格。此外,如果这是家庭作业,你应该这样说。)

系列的定义/6

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

  • 忽略第一个参数和第四个参数(下划线)
  • 统一第二个和最后一个参数(两个参数都由相同的变量名Smith引用)
  • 将第三个参数与atom统一起来
    lucy
  • 将第五个参数与atom
    jeff
    统一起来
  • 现在你的提问,

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

    • 你能用同一个变量统一第一个和第三个参数吗,福特?
      • 是的,你可以,现在
        Ford=lucy
        (定义中的3)
    • 第二个参数是否可以是atom
      nancy
      • 是,并且
        White=nancy
        (定义中的2)
    • 第四个参数是否可以是atom
      jeff
      • 是的,但这没有任何影响(从定义中的1开始)
    • 你能把第五个参数和变量Smith统一起来吗?
      • 是,并且
        Smith=jeff
        (定义中的4)
    这一点现在应该很清楚了,假设您知道统一是如何工作的。重要的是,定义中的变量名和查询中的变量名处于不同的上下文中,具有相同的名称并不意味着什么(如定义中位置2和6的Smith和查询中位置5的Smith)

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

    作为可视化帮助,我们可以将谓词和查询一个接一个地编写

       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.
    
    i、 e


    最后一个是
    White=A
    A=nancy
    的结果<代码>A本身不会被报告,因为它不是查询的逻辑变量之一。

    常量(所谓的原子)以小写字母开头。但有些名称以大写字母开头。把那些名字加引号。就像《史密斯》哦,我不想得到不同的结果或任何东西。这是一个来自一个类的老例子,在这个类中,我们得到了定义和查询,我们假设在纸上计算出结果。我把它打出来看看结果会是什么,但我不确定为什么会这样。这并不是说它失败了。。。结果是“福特=露西,史密斯=杰夫,怀特=南希”。我把它全部输入swipl以查看结果,但我不确定为什么会出现这样的结果。你的问题中一定有输入错误。如前所述,您的查询将迫使
    Smith
    nancy
    jeff
    统一起来,这是不可能的。@hardmath I在这方面也失败了一分钟,但谓词中有变量。:)(…我甚至对你的评论投了更高的票):)太棒了,谢谢。这不是家庭作业,只是考试复习中的一个例子:)
    Ford=lucy, Smith=jeff, White=nancy.