【问题标题】:Order of Goals in Pure PrologPure Prolog 中的目标顺序
【发布时间】:2016-06-11 08:06:27
【问题描述】:

我对序言很陌生。据我所知,Pure Prolog 仅限于 Horn 子句。 这是一个非常简单的prolog程序 -

 % student( Snr    , FirstName , LastName   , Semester ).
  student(  1000  , 'Anna'    , 'Arm'      , 'ti2'    ) .
  student(  1001  , 'Rita'    , 'Reich'    , 'ti2'    ) .
  student(  1002  , 'Peter'   , 'Reich'    , 'ti2'    ) .
  student(  1003  , 'Peter'   , 'Petersen' , 'ti7'    ) .


% course( Semester , Course     ) .
  course( 'ti2'    , 'Mathe2'   ) .
  course( 'ti2'    , 'Physics2' ) .
  course( 'ti7'    , 'pdv2'     ) .

 musttake(M,V,N,S,C) :- student(M,V,N,S),  course(S,C).

musttakereverse(M,V,N,S,C) :- course(S,C), student(M,V,N,S).

我的大学幻灯片说,即使我们颠倒 Pure Prolog 规则中目标的顺序,结果的顺序也不应该改变。在上面的代码中,我实现了 2 条规则。 musttakemusttakereverse 我只是改变了目标的顺序。因此,根据幻灯片,运行时不应更改结果的顺序。 但是,当我运行代码时,它们会以不同的顺序给出结果。(据我了解,上述程序位于pure prolog)。

所以,我想知道这是不是真的

Goal 中顺序的改变不会改变 Pure Prolog 代码中结果的顺序。

谢谢!

【问题讨论】:

  • 你确定他们没有说“改变目标的顺序不会影响结果集”而不是“结果的顺序”吗?
  • 确切的短语是这样的——“一个极端的例子:交换目标可能会导致在某些递归规则中无休止的递归调用。但是,结果的顺序并没有什么不同。”

标签: prolog logical-purity


【解决方案1】:

这是一个最小的例子来说明“结果的顺序”,即生成的答案替换的顺序受子句中目标顺序的影响:

p(X) :- p123(X), p321(X), p213(X).

p123(1). p123(2). p123(3).

p321(3). p321(2). p321(1).

p213(2). p213(1). p213(3).

请注意,所有四个谓词都描述了完全相同的一组解决方案。在这种情况下,p/1 的精确顺序由第一个目标决定。

目标顺序不影响的是解决方案集。这是最有趣的属性。

可能无法保留的最有趣的属性是终止。通过交换目标,终止属性可能会受到影响。

然后,我承认,还有另一个保留属性不是很有趣:冗余答案/解决方案的存在也被保留了。

【讨论】:

    【解决方案2】:

    你是对的。

    如果你使用查询

    ?-musttake(M,V,N,S,C).
    

    目标student(M,V,N,S)通过第一个事实得到满足,那么course(S,C)通过第五个事实得到满足。如果我们跟踪 M 的演变,它的值将是 1000。

    下一个可能的答案将来自调查 last 回溯点,它位于 course(S,C)不是 student(M,V,N,S)。通过第六个事实改变了 C 的值,但 M 的值没有改变,所以在第二个解中 M 仍然是 1000。

    但是,如果您使用其他查询:

     ?-musttakereverse(M,V,N,S,C)
    

    目标course(S,C)通过第5个事实得到满足,那么目标student(M,V,N,S)通过第一个事实得到满足,这再次给了M值1000,但是下一个解决方案调查最后一个回溯点,也就是这次student(M,V,N,S),使用第二个事实,M的值为1001。

    Prolog 使用深度优先搜索并从上到下和从左到右对子句和目标进行排序,我只能假设您的幻灯片包含错字。 您可以阅读更多关于子句和目标排序的内容here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多