【问题标题】:Concatenation of Strings in PrologProlog中的字符串连接
【发布时间】:2015-11-15 23:38:23
【问题描述】:

我正在尝试在 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).

【问题讨论】:

  • join4(String1,String2,String3,String4,Newstring) :- atomic_list_concat([String1,String2,String3,String4],Newstring).

标签: string prolog concatenation string-concatenation


【解决方案1】:

我不确定你的限制是什么,但你也可以使用 SWI 的 append/2maplist/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 中使用 default 设置:

:- set_prolog_flag(double_quotes,atom).

其中"abc" 表示Prolog atom,等效于'abc'

【讨论】:

  • @false 确实,这是正确的。我正在使用 OP 在他们最初的问题中理解和使用的内容。
  • :- set_prolog_flag(double_quotes,chars).
【解决方案2】:

您需要至少 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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多