Pure Prolog中的目标顺序

时间:2016-02-28 07:40:27

标签: prolog logical-purity

我对prolog很新。据我所知,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)。

所以,我想知道

是否属实
  

目标中订单的更改不会更改Pure Prolog代码中结果的顺序。

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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的精确顺序在这种情况下由第一个目标确定。

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

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

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

答案 1 :(得分:3)

你是对的。

如果您使用查询

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

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

下一个可能的答案来自于调查最后 回溯点,其位于course(S,C) {{1} }。 C的值通过第6个事实改变,但是M的值不是,因此在第二个解决方案中M仍然是1000。

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

student(M,V,N,S)

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

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