Пролог список к строке через запятую - PullRequest
5 голосов
/ 04 мая 2011

У меня есть список типа [apple, orange], и я хочу преобразовать его в строку типа "apple,orange" в Прологе. У тебя есть идеи?

Ответы [ 6 ]

6 голосов
/ 25 апреля 2014

В SWI-Prolog вы можете просто использовать atomic_list_concat/3 и atom_string/2:

?- atomic_list_concat([apple, banana, oranges], ',', Atom), atom_string(Atom, String).

Atom = 'apple,banana,oranges',
String = "apple,banana,oranges".
4 голосов
/ 04 мая 2011

В SWI-Prolog вы можете использовать with_output_to/2.Ниже приведены две версии, одна с использованием write/1, а другая writeq/1.Из вашего вопроса не ясно, какое поведение вам требуется.

?- List = [apple, 'ora\\nge'], with_output_to(codes(Codes), write(List)),
   format("~s", [Codes]).
[apple,ora\nge]
List = [apple, 'ora\\nge'],
Codes = [91, 97, 112, 112, 108, 101, 44, 111, 114|...].

?- List = [apple, 'ora\\nge'], with_output_to(codes(Codes), writeq(List)),
   format("~s", [Codes]).
[apple,'ora\\nge']
List = [apple, 'ora\\nge'],
Codes = [91, 97, 112, 112, 108, 101, 44, 39, 111|...].
1 голос
/ 04 мая 2011

если вы используете swi-prolog, вы также можете сделать следующее:

1) использовать string_to_list / 2 (вы можете дать список и получить строку или дать строку и получить список).проблема в том, что он не будет вставлять запятые, поэтому вам придется вставлять запятые между элементами вашего списка вручную;что-то вроде

insert_commas([],[]).
insert_commas([H|T],[H,', '|TC]):-
   insert_commas(T,TC).

, поэтому ваш предикат будет выглядеть примерно так:

list_string_with_commas(L,S):-
   insert_commas(L,LC),
   string_to_list(S,LC).

2) вы можете использовать swritef / 3 и string_concat / 3.swritef / 3 работает как writef / 2, но вместо записи в выводе он создает строку с данными.

list_string_with_commas([],"").
list_string_with_commas([H,T],S):-
    swritef(SH,"%t, ",[H]),
    list_string_with_commas(T,ST),
    string_concat(SH,ST,T).

вам может потребоваться выполнить некоторые оптимизации хвостовой рекурсии

0 голосов
/ 13 августа 2018

term_string (30 символов мин SO)

0 голосов
/ 12 октября 2013

Извините, не хватает представителя для добавления этого комментария к ответу Гэвина Лока.Решение Гэвина хорошо, насколько это возможно, но оно должно быть изменено, чтобы избежать дублирования ответов (или, скорее, вариации на тот же ответ).Проблема в том, что список с одним атомом будет объединен в два предложения в list_codes / 2: второе И третье предложение.(У списка с одним элементом все еще есть хвост, то есть пустой список.) Я считаю, что желательна только привязка второго предложения.Похоже, что третье предложение предназначено для рекурсивной работы со списками, которые все еще содержат как минимум два элемента.Поэтому я рекомендую изменить это предложение следующим образом:

list_codes([Atom,Next|ListTail], Codes) :-
    atom_codes(Atom, AtomCodes),
    list_codes([Next|ListTail], ListTailCodes),
    append(AtomCodes, ",", AtomCodesWithComma),
    append(AtomCodesWithComma, ListTailCodes, Codes).

Это объединит только тогда, когда список содержит как минимум два элемента, и предотвратит получение двух решений.

0 голосов
/ 04 мая 2011

Я новичок в Прологе - но это то, что я придумал.

list_codes([], "").

list_codes([Atom], Codes) :- atom_codes(Atom, Codes).

list_codes([Atom|ListTail], Codes) :-
        atom_codes(Atom, AtomCodes),
    append(AtomCodes, ",", AtomCodesWithComma),
    append(AtomCodesWithComma, ListTailCodes, Codes),
    list_codes(ListTail, ListTailCodes).

list_string(List, String) :-
    ground(List),
    list_codes(List, Codes),
    atom_codes(String, Codes).

list_string(List, String) :-
    ground(String),
    atom_codes(String, Codes),
    list_codes(List, Codes).

, который дает:

?- list_string([], S).
S = '' .

?- list_string([apple], S).
S = apple .

?- list_string([apple, orange], S).
S = 'apple,orange' .

?- list_string([apple, orange, peach], S).
S = 'apple,orange,peach' .

и:

?- list_string(L, '').
L = [] .

?- list_string(L, 'banana').
L = [banana] .

?- list_string(L, 'banana,litchi').
L = ['banana,litchi'] .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...