纯Prolog中的目标顺序
我对序言很陌生。据我所知,纯序言仅限于Horn子句。 这是一个非常简单的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'
% 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
的精确顺序由第一个目标决定
目标的顺序不会影响解决方案集。这是最有趣的财产
可能无法保留的最有趣的属性是终止。通过交换目标,终止属性可能会受到影响
此外,还有另一个保留的属性,我承认,它不是很有趣:冗余答案/解决方案的存在也被保留。你确定他们没有说“改变目标的顺序不会影响结果集”而不是“结果的顺序”?确切的说法是这样的-一个极端的例子:在某些递归规则中,交换目标可能导致无休止的重新草书调用。然而,结果的顺序并没有什么不同。”