如何创建此Prolog谓词的“较深”版本,该版本会影响子列表?

时间:2019-03-20 20:32:32

标签: list prolog

我当前的谓词eo将从第一个元素开始删除列表中的所有其他元素。

eo([],[]).
eo([_],[]).
eo([_,X|L],[X|R]) :- eo(L,R)].

产生类似

的结果
?- eo([a,b,c,d,e,f],L).
L = [b,d,f]

?- eo([a,b,c,d,e,f,g],L).
L = [b,d,f]

但是现在,我想创建一个“深”版本。此版本还将影响子列表。因此,应满足以下条件:

?- eo([a,b,c,d,e,[x,y,z],L).
L=[b,d,[y]]

不确定该怎么办。

1 个答案:

答案 0 :(得分:0)

因此,以您现在拥有的为基础,这基本上是您必须进行的更改:

eo([],[]).
eo([_],[]).
eo([_,X|L],[X2|R]) :- 
    (is_list(X) ->   %% is X a list?
         eo(X, X2)   %%  - yes, so recur on it
    ;    X2 = X      %%  - no, so just pass it through
    ), 
    eo(L,R).
相关问题