我对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条规则。 musttake
和musttakereverse
我只是改变了目标的顺序。因此,根据幻灯片,运行时结果的顺序不应该改变。
但是,当我运行代码时,他们会以不同的顺序给出结果。(根据我的理解,上面的程序在pure prolog
)。
所以,我想知道
是否属实目标中订单的更改不会更改Pure Prolog代码中结果的顺序。
谢谢!
答案 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的更多信息。