Изменить элементы списка на строку с пробелами в Prolog

В Прологе, если я беру список, такой как [hello,this,is,a,sentence], в качестве параметра для предиката, как мне получить возвращаемое значение Y, чтобы он вернул этот список в виде строки с пробелами? например [привет,это,предложение] вернет привет, это предложение.

makesentence([H|T],Y):- % some code here

Я смог рекурсивно просмотреть список, и Y вернул тот же ввод списка с помощью этого:

makesentence([],[]).        % base case returns an empty list
makesentence([X],[X]).      % one list element returns that element in a list
makesentence([H|T],Y):-     % a list of more than one element
    makesentence(T,Result), % recursively call function on the tail
    append([H],Result,Y).   % append the head to the rest of the list

Но когда я пытаюсь сделать вывод без списка и с пробелами, я ошибаюсь. Я пробовал это:

makesentence([],'').
makesentence([X],X).
makesentence([H|T],Y):-
    makesentence(T,Result),
    append(H,Result,Y).

Я думаю, это связано с тем фактом, что предикат append в Прологе имеет дело только с добавлением списка, но я не уверен. Как бы я поступил? Заранее спасибо.


person Jodo1992    schedule 07.12.2015    source источник
comment
atom_concat/3 может быть вашим билетом.   -  person Daniel Lyons    schedule 08.12.2015


Ответы (2)


Для этого в SWI-Prolog есть специальный встроенный модуль: atomic_list_concat. /3

?- atomic_list_concat([hello,this,is,a,sentence],' ',A).
A = 'hello this is a sentence'.
person CapelliC    schedule 08.12.2015

разобрался с помощью Даниэля. Чтобы поместить список в строку с пробелами, используйте atomics_to_string/3. В моем случае:

makesentence([X],X).
makesentence([H|T],Y):-
    makesentence(T,Result),
    atomics_to_string([H,Result],' ',Y).

В строке atoms_to_string([H,Result],' ',Y). первый параметр — это список, второй — это то, что я хочу добавить между каждой записью, в данном случае пробел ' ', а третий параметр — это назначение вывода, в моем случае это Y. Спасибо. Даниэлю за указание мне в правильном направлении.

person Jodo1992    schedule 08.12.2015