List 删除Prolog中列表的第一个元素

List 删除Prolog中列表的第一个元素,list,prolog,elements,List,Prolog,Elements,我的问题是如何删除列表中的第一个元素,直到元素出现(第一次出现)。 列表可以有重复的元素 例如 到目前为止,我得到的是: remove_elements(Element, [], []). remove_elements(Element, [Element|Tail], [Tail]). remove_elements(Element, [Head|Tail], [Tail]) :- Head \== Element, remove_elements(Element, Tail,

我的问题是如何删除列表中的第一个元素,直到元素出现(第一次出现)。 列表可以有重复的元素

例如

到目前为止,我得到的是:

remove_elements(Element, [], []).
remove_elements(Element, [Element|Tail], [Tail]).
remove_elements(Element, [Head|Tail], [Tail]) :-
    Head \== Element,
    remove_elements(Element, Tail, Tail).
我不能使用任何图书馆

如果<代码>元素<代码>位于第一位置,则该解决方案是正确的,但如果是在中间,则失败。


谢谢

只要稍加修改,小心统一

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和T是相同的常数
  • sat是(自由)变量(S和T相等(它们共同引用))
  • S是一个变量,T是一个术语≠ 变量(T项替换为变量S)
  • T是一个变量,S是一个术语≠ 变量(术语S替换为变量T)
  • sat是复合项(具有相同的主函子,相应的参数是可统一的)
示例:

?- 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)).

false。

Tail
已经是一个列表,与您在此上下文中使用的方式相同。所以你不想要
[Tail]
。这将是一个由单个列表元素组成的列表。可以使用append/3和member/2吗?
?- f(c,a(b,c)) = f(Y,a(Y,c)).