【发布时间】:2017-04-21 23:08:12
【问题描述】:
我在 Prolog 中有两个稍微不同的谓词实现,unique_element/2。当给定一个元素X 和一个列表L 时,谓词成功,元素X 在列表中只出现一次。下面是实现和结果:
实施 1:
%%% unique_element/2
unique_element(Elem, [Elem|T]) :-
not(member(Elem, T)).
unique_element(Elem, [H|T]) :-
member(Elem, T),
H\==Elem,
unique_element(Elem, T),
!.
结果:
?- unique_element(X, [a, a, b, c, c, b]).
false.
?- unique_element(X, [a, b, c, c, b, d]).
X = a ;
X = d.
实施 2:
%%% unique_element/2
unique_element(Elem, [Elem|T]) :-
not(member(Elem, T)).
unique_element(Elem, [H|T]) :-
H\==Elem,
member(Elem, T),
unique_element(Elem, T),
!.
如果您一开始没有注意到:H\==Elem 和 member(Elem, T) 在第二个 impl 中翻转,规则 2。
结果:
?- unique_element(X, [a, a, b, c, c, b]).
X = a.
?- unique_element(X, [a, b, c, c, b, d]).
X = a ;
X = d.
问题:在这种情况下,订单如何影响结果?我意识到规则/事实/等的顺序很重要。但是,这两个被翻转的特定规则似乎没有“联系”或以某种方式相互影响(例如,cut 位置/顺序错误)。
注意:我们在这里讨论的是 SWI-Prolog。
注 2:我知道,可能不同且更好的实现。我的问题是关于更改子目标的顺序。
【问题讨论】:
-
对于
unique_element(X,[a,b,c]), X = c.,两个版本都错误地失败了
标签: prolog