纯Prolog中的目标顺序

纯Prolog中的目标顺序,prolog,logical-purity,Prolog,Logical Purity,我对序言很陌生。据我所知,纯序言仅限于Horn子句。 这是一个非常简单的prolog程序- % student( Snr , FirstName , LastName , Semester ). student( 1000 , 'Anna' , 'Arm' , 'ti2' ) . student( 1001 , 'Rita' , 'Reich' , 'ti2' ) . student( 1002 , 'Peter'

我对序言很陌生。据我所知,纯序言仅限于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).
我的大学幻灯片上说,即使我们在纯Prolog规则中颠倒了目标的顺序,结果的顺序也不应该改变。在上面的代码中,我实现了两条规则
musttake
musttake reverse
中,我只是更改了目标的顺序。因此,根据幻灯片,运行时不应更改结果的顺序。 但是,当我运行代码时,它们以不同的顺序给出结果(据我所知,上面的程序是在
纯prolog
中)

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

在纯Prolog代码中,目标中的顺序更改不会更改结果的顺序

谢谢

你说得对

如果您使用查询

?-musttake(M,V,N,S,C).
学生(M,V,N,S)的目标通过第一个事实得到满足,然后通过第五个事实得到满足。如果我们追踪M的演化,它的值将为1000

下一个可能的答案是调查最后一个回溯点,该点位于
课程(S,C)
不是
学生(M,V,N,S)
。第六个事实改变了C的值,但是M的值没有改变,所以在第二个解中M仍然是1000

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

 ?-musttakereverse(M,V,N,S,C)
目标
课程(S,C)
通过第五个事实得到满足,然后目标
学生(M,V,N,S)
通过第一个事实得到满足,第一个事实再次给出M值1000,但下一个解决方案调查最后一个回溯点,这一次是
学生(M,V,N,S)
,使用第二个事实,M的值是1001

Prolog使用深度优先搜索,并从上到下和从左到右排列子句和目标,我只能假设您的幻灯片包含拼写错误。
您可以阅读有关子句和目标顺序的更多信息。

这里有一个简单的示例来说明“结果顺序”,即生成的答案替换顺序受子句中目标顺序的影响:

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
的精确顺序由第一个目标决定

目标的顺序不会影响解决方案集。这是最有趣的财产

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


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

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