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

时间:2015-05-09 09:19:01

标签: list prolog elements

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

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位于第一个位置,则解决方案是正确的,但如果它在中间位置则失败。

由于

1 个答案:

答案 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)).

假。