Как мне создать «глубокую» версию этого предиката пролога, которая будет влиять на подсписки? - PullRequest
0 голосов
/ 20 марта 2019

Мой текущий предикат 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 голосов
/ 21 марта 2019

Итак, принимая то, что у вас есть сейчас, это в основном то, что вы должны сделать:

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...