我的问题是如何删除列表的第一个元素,直到元素(第一次出现)。 该列表可以包含重复的元素。
E.g。
?- L = [a, b, c, a, c, d], remove_elements(c, L, Result).
Result = [c, a, c, d].
到目前为止我所拥有的是:
remove_elements(Element, [], []).
remove_elements(Element, [Element|Tail], [Tail]).
remove_elements(Element, [Head|Tail], [Tail]) :-
Head \== Element,
remove_elements(Element, Tail, Tail).
我不能使用任何库。
如果Element
位于第一个位置,则解决方案是正确的,但如果它在中间位置则失败。
由于
答案 0 :(得分:1)
只需要很少的修正,小心统一。
remove_elements(Element, [], []).
remove_elements(Element, [Element|Tail], [Element|Tail]).
remove_elements(Element, [Head|Tail], List) :-
Head \== Element, remove_elements(Element, Tail, List).
如果出现以下情况,则条款S和T均可统一:
- S a T是相同的常量
- S a T是(自由)变量(S和T相等(它们共同引用))
- S是变量,T是项≠变量(项T代入变量S)
- T是变量,S是项≠变量(项S代入变量T)
- S a T是复合词(具有相同的主要函子,相应的参数是统一的)
示例:
?- f(X,a(b,c)) = f(d,a(Y,c)).
X = d,Y = b。
?- f(X,a(b,c)) = f(Y,a(Y,c)).
X = Y = b
?- f(c,a(b,c)) = f(Y,a(Y,c)).
假。