我正在尝试制作谓词,对于列表X和Y,如果X和Y是相同的列表,则rmlast为真,除了Y有1个元素的事实。所以[1] [1,2]或[3,2] [3,2,5]。
rmlast([], [_]). :- true.
rmlast([X|xtail], [Y|ytail]) :- rmlast(xtail,ytail), X is Y.
然而,这会对基本情况以外的任何内容产生错误结果。
答案 0 :(得分:6)
您的代码不起作用,因为xtail
和ytail
是用小写字母书写的,因此不是变量。这有效:
rmlast([], [_]).
rmlast([X|T1], [X|T2]) :- rmlast(T1, T2).
除此之外:
如您所见,在这种情况下无需变量X
和Y
:只需在适当的位置使用X
两次。
你写道:
rmlast([], [_]). :- true.
这与:
相同rmlast([], [_]).
:- true.
正如您所看到的那样,第二个语句不会增加任何内容,因此可以安全地删除。
答案 1 :(得分:1)
rmlast([H],[]).
rmlast([H1|Tail1],[H2|Tail2]):-
H1 = H2,rmlast(Tail1,Tail2).
不要使用'is',它不是一个逻辑运算符。它是一个赋值运算符。请改用“=”。