String Prolog中字符串的串联

String Prolog中字符串的串联,string,prolog,concatenation,string-concatenation,String,Prolog,Concatenation,String Concatenation,我试图在Prolog中连接4个字符串。我能够连接2和3个字符串,但我不能让它与4一起工作。这就是我到目前为止所做的: join2(String1,String2,Newstring) :- name(String1,L1), name(String2,L2), append(L1,L2,Newlist), name(Newstring,Newlist). join3(String1,String2,String3,Newstring) :- join2(String1,

我试图在Prolog中连接4个字符串。我能够连接2和3个字符串,但我不能让它与4一起工作。这就是我到目前为止所做的:

join2(String1,String2,Newstring) :-
   name(String1,L1), name(String2,L2),
   append(L1,L2,Newlist),
   name(Newstring,Newlist).

join3(String1,String2,String3,Newstring) :-
   join2(String1,String2,S),
   join2(S,String3,Newstring).

join4(String1,String2,String3,String4,Newstring) :-
   join3(String1,String2,String3,Newstring),
     join2(String1,String2,S),
     join2(S,String3,Newstring).
   join3(Newstring,String4,Newstring).

要连接4个字符串,您至少需要2个中间新闻字符串,但建议的解决方案仅使用1个(
S
),尽管它尝试使用
NewString
作为中间结果和最终结果

进一步了解您为
join3所做的工作:

join4(S1,S2,S3,S4,NS) :-
    join2(S1,S2,NS12),
    join2(S3,S4,NS34),
    join2(NS12,NS34,NS).

我不确定您的限制是什么,但您也可以使用SWI的
append/2
maplist/3

concatenate(StringList, StringResult) :-
    maplist(atom_chars, StringList, Lists),
    append(Lists, List),
    atom_chars(StringResult, List).
然后,您可以连接任意数量的:

?- concatenate(["hello", ", ", "world"], String).
String = 'hello, world'.

?- concatenate(["hey, ", "you ", "don't ", "say!"], String).
String = 'hey, you don\'t say!'.

?-
请注意,以上假设您使用的是SWI Prolog中的默认设置:

:- set_prolog_flag(double_quotes,atom).

其中,
“abc”
表示一个Prolog原子,相当于
“abc”
join4(String1,String2,String3,String4,Newstring):-atomic\u list\u concat([String1,String2,String3,String4],Newstring)。
@事实上,这是正确的。我对OP在他们最初的问题中理解和使用的内容进行了讨论。
:-set_prolog_flag(双引号,字符)。