首页 > 解决方案 > 如何创建会影响子列表的此 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]]

不知道该怎么办。

标签: listprolog

解决方案


所以,以你现在所拥有的,这基本上是你必须做出的改变:

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

推荐阅读