Разделить список в прологе - PullRequest
0 голосов
/ 07 августа 2011

предположим, у меня есть этот список в прологе:

[-0.791666666666667-[]-[predicate(a,b,c,d)]-[predicate_2(p,e,q,d,g)]]

есть способ разделить это на:

-0.791666666666667, [], [predicate(a,b,c,d)], [predicate_2(p,e,q,d,g)] ???

Сплит означает, что есть разные кусочки списка.

Может быть:

X = -0.791666666666667  Y = []  Z = [predicate(a,b,c,d)] etc...

Или другое решение можно заменить - на "," чтобы оно стало списком с разными элементами?

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Trivial:

to_list([A-B-C-D], [A,B,C,D]).

Использование:

?- to_list([-0.791666666666667-[]-[predicate(a,b,c,d)]-[predicate_2(p,e,q,d,g)]],
           L).
L = [-0.791667, [], [predicate(a, b, c, d)], [predicate_2(p, e, q, d, g)]].

Или сделайте сопоставление с шаблоном встроенным, написать растерянный предикат для такой задачи довольно непросто.для меня.

0 голосов
/ 07 августа 2011

Вы можете использовать сопоставление с образцом.Подобно тому, как вы используете его в списках ([H|T]):

split(A, R) :- split(A, R, []).

split(A-B, R, Acc) :- split(A, R, [B|Acc]), !.
split(H, [H|T], T).

Я использую аккумулятор, потому что что-то вроде a-b-c делится на A-B на a-b и c.

РЕДАКТИРОВАТЬ: Если вы знаете, что у вас есть 4 условия, вы можете использовать что-то вроде

split(A-B-C-D, A, B, C, D).
...