2014-02-19 5 views
2

Привет, есть ли способ разделить список в Prolog на два других списка, первый включает в себя все перед элементом и второе после элемента. НапримерСписки разметки Prolog

A=[1,2,3,5,7,9,0] and element=5 

два списка должны быть

A1=[1,2,3] and A2=[7,9,0] 

Я не забочусь о нахождении элемента только что делать дальше

ответ

1

легко, как

?- Elem = 5, A = [1,2,3,5,7,9,0], append(A1, [Elem|A2], A). 

отредактируйте, чтобы немного объяснить ...

append/3 это отношение среди 3 списков.

Это достаточно универсально, чтобы решить любую конкатенацию на собственных списках - когда не существует круговых аргументов.

Сравнение это простое объединение, которое имеет место во втором аргументе. Это должен быть список, начинающийся с Elem. Синтаксис конструктора списка Prolog - [Head|Tail]. Чтобы сделать унификацию успешной, Элем должен матч Голова.

+0

Это работает, но можете ли вы дать мне краткое объяснение, как работает append? Я знаю, что дать list1 и list2 он объединяет их в один список. Также как происходит сравнение? – JmRag

+0

Thx много для вашего времени! – JmRag

2

Вот альтернативный метод, показывающий, как обрабатывать его список рекурсии:

split([E|T], E, [], T). 
split([X|T], E, [X|LL], LR) :- 
    X \== E, 
    split(T, E, LL, LR). 

Или лучше, если ваш Prolog поддерживает dif/2:

split([E|T], E, [], T). 
split([X|T], E, [X|LL], LR) :- 
    dif(X, E), 
    split(T, E, LL, LR). 

Примеры:

| ?- split([1,2,3,4,5], 3, L, R). 

L = [1,2] 
R = [4,5] ? ; 

no 
| ?- split([1,2,3,4,5], 5, L, R). 

L = [1,2,3,4] 
R = [] ? ; 

(1 ms) no 
| ?- split([1,2,3,4,5], 1, L, R). 

L = [] 
R = [2,3,4,5] ? ; 

no 
| ?- 

Это своего рода специализированный поворот на append/3, показанный CapelliC.

+0

@ спасибо, да, я согласен. Причина, по которой я не всегда использую 'dif/2', - это потому, что обычно тяготеет к моей установке gprolog, у которой нет' dif/2'. Я пробовал некоторую реализацию так «dif/2», которая, похоже, не делала то же самое. – lurker

Смежные вопросы