【发布时间】: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 条规则。 musttake 和 musttakereverse 我只是改变了目标的顺序。因此,根据幻灯片,运行时不应更改结果的顺序。
但是,当我运行代码时,它们会以不同的顺序给出结果。(据我了解,上述程序位于pure prolog)。
所以,我想知道这是不是真的
Goal 中顺序的改变不会改变 Pure Prolog 代码中结果的顺序。
谢谢!
【问题讨论】:
-
你确定他们没有说“改变目标的顺序不会影响结果集”而不是“结果的顺序”吗?
-
确切的短语是这样的——“一个极端的例子:交换目标可能会导致在某些递归规则中无休止的递归调用。但是,结果的顺序并没有什么不同。”
标签: prolog logical-purity