【发布时间】:2013-11-23 21:36:43
【问题描述】:
我目前正在开发一个 Prolog 程序以从列表中删除重复项。
这是我的代码:
makeset([First], [First]). % if only one item in list, the solution is itself.
makeset([First, Second], [First, Second]) :-
dif(First, Second).
makeset([First, Second], [First]) :-
First = Second.
% if more than two items in list
makeset([First | Tail], FinalList) :-
member(First, Tail),
makeset(Tail, FinalList).
makeset([First | Tail], FinalList) :-
not(member(First, Tail)),
makeset(Tail, [First |FinalList]).
但是,当我在包含两个以上项目的列表上尝试此操作时,它只会返回 false。我进行了跟踪,发现它继续使用最后两个规则,即使它下降到列表中的两个项目。这是为什么呢?
查询示例:makeset([3, 2, 4, 5, 1], X).
我返回错误,但每次评估都使用最后一条规则。
编辑: 我将规则更改为以下规则,但仍然无法正确评估,因此问题必须与最后一条规则有关。
makeset([First], FinalList) :-
FinalList = [First]. % if only one item in list, the solution is itself.
makeset([First, Second], FinalList) :-
not(First = Second), FinalList = [First, Second].
makeset([First, Second], FinalList) :-
First = Second, FinalList = [First].
% if more than two items in list
makeset([First | Tail], FinalList) :-
member(First, Tail), makeset(Tail, FinalList).
makeset([First | Tail], FinalList) :-
not(member(First, Tail)), makeset(Tail, [First |FinalList]).
我该如何修正最终规则?
【问题讨论】: