将列表元素更改为Prolog中带空格的字符串

时间:2015-12-07 22:24:22

标签: string list recursion prolog swi-prolog

在Prolog中,如果我将[hello,this,is,a,sentence]等列表作为谓词的参数,如何获得返回值Y,以便将该列表作为字符串返回有空格?例如 [hello,this,is,a,sentence] 将返回你好这是一个句子

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).

我认为这与Prolog中的append谓词仅处理附加列表这一事实有关,但我不确定。我该怎么办?提前谢谢。

2 个答案:

答案 0 :(得分:3)

SWI-Prolog有一个专门的内置:atomic_list_concat / 3

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

答案 1 :(得分:0)

在丹尼尔的帮助下弄明白了。要将列表放入带空格的字符串,请使用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.感谢Daniel指出我正确的方向。