2015-11-15 2 views
2

Я пытаюсь объединить 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). 
+0

'join4 (String1, String2, String3, String4, Newstring): - atomic_list_concat ([String1, String2, String3, String4], Newstring) .' – CapelliC

ответ

1

Вы будете нуждаться по крайней мере, 2 промежуточных NewString с в порядке чтобы присоединиться к 4 строкам, но в предлагаемом решении используется только 1 (S), хотя он пытается использовать NewString как промежуточный, так и конечный результат.

Возьмите то, что вы сделали для join3 шаг дальше:

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

Я не уверен, что ваши ограничения, но вы также можете использовать 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" представляет собой атом Пролог и эквивалентно 'abc'.

+0

@false действительно, это правильно. Я катался с тем, что ОП понимал и использовал в своем первоначальном вопросе. – lurker

+2

': - set_prolog_flag (double_quotes, chars) .' – false

Смежные вопросы