выровнять список, заменив запятую на плюс оператор внутри списка в прологе - PullRequest
2 голосов
/ 11 марта 2012

Я работаю над сценарием в Прологе (затмение), где мне нужно переформатировать структуру списка.

У меня есть список формы:

MyList = [a,b,c].

Я пытался выяснить, смогу ли я сгладить список до одного элемента со всеми запятыми, замененными оператором +.

Итак, мой список результатов будет выглядеть так:

ResultList = [a+b+c] 

, который представляет собой список из одного элемента. Длина исходного списка произвольна.

Я знаю, что пролог не подходит для таких операций, но можно ли это сделать?

Ответы [ 3 ]

4 голосов
/ 11 марта 2012

вот оно, в стандартном прологе. Я думаю, что не должно быть никакой разницы с Eclipse:

list_to_op([X,Y|T], [R]) :-
    list_to_op(T, X+Y, R).

edit : ошибка отмечена как false

list_to_op([X], [X]).

list_to_op([X], R, R+X).
list_to_op([X|T], R, Q) :-
    list_to_op(T, R+X, Q).

тест:

?- list_to_op([a,b,c],X).
X = [a+b+c] .

Аккумулятор необходим для придания соответствующей ассоциативности: более простое и понятное определение

list_to_op1([X], X).
list_to_op1([X|R], X+T) :-
   list_to_op1(R, T).

дает

?- list_to_op1([a,b,c],X).
X = a+ (b+c) .

Если важен порядок оценки, используйте list_to_op.

редактировать : есть ошибка: list_to_op ([a, b], X) завершается неудачей.

здесь исправление, как это часто бывает, это упрощение:

list_to_op([], R, R).
list_to_op([X|T], R, Q) :-
    list_to_op(T, R+X, Q).
1 голос
/ 11 марта 2012

Это может помочь

flatten_list(A,[B]) :- flatten_list_inner(A,B).

flatten_list_inner([A],A).
flatten_list_inner([H|T],H+Y) :- flatten_list_inner(T,Y). 

Вывод немного отличается от того, что вы хотели. В настоящее время [a + (b + c)]

0 голосов
/ 12 марта 2012

Как насчет этой нерекурсивной версии ..

list_to_op(L, Res) :-
    concat_atom(L, '+', Atom),
    Res = [Atom].


?-  list_to_op([a,b,c], X).
X = ['a+b+c'].

Редактировать: Это работает в Swi-прологе .. не уверен насчет Eclipse.

...