【问题标题】:Replacing substrings in Prolog [duplicate]替换 Prolog 中的子字符串 [重复]
【发布时间】:2020-01-11 10:08:33
【问题描述】:

为了替换字符串中的子字符串,我写了一个谓词replace_substring。它使用 SWI-Prolog 的 append/3 谓词:

:- initialization(main).
:- set_prolog_flag(double_quotes, chars). 

main :-
    replace_substring("this is a string","string","replaced string",Result),
    writeln(Result).

replace_substring(String,To_Replace,Replace_With,Result) :-
    append(First,To_Replace,String),
    append(First,Replace_With,Result).

不过,我不确定这是否是在 Prolog 中替换子字符串的最有效方法。 Prolog 是否具有可用于相同目的的内置谓词?

【问题讨论】:

  • 你对replace_substring("aa","a","b", R)有什么期望?
  • replace_substring("abc", "bc", "23", R). 会成功,但replace_substring("abc", "b", "2", R). 会失败,因为只有当被替换的子字符串是原始字符串的后缀时,您的实现才会成功。

标签: replace prolog


【解决方案1】:

简短的回答是,不,Prolog 没有内置的字符串替换谓词。如果该子字符串位于原始字符串的末尾,您显示的内容只会替换该子字符串。也就是说,它将替换字符串"xyzabc"中的"abc",但不会替换字符串"xyabcz"中的"abc"

你可以使用append/2:

replace_substring(String, To_Replace, Replace_With, Result) :-
    append([Front, To_Replace, Back], String),
    append([Front, Replace_With, Back], Result).

如果您希望它成功而不替换不匹配,那么:

replace_substring(String, To_Replace, Replace_With, Result) :-
    (    append([Front, To_Replace, Back], String)
    ->   append([Front, Replace_With, Back], Result)
    ;    Result = String
    ).

正如@false 在他的问题中暗示的那样,您是否要处理替换多次出现的问题?如果是这样,您的方法的扩展将是:

replace_substring(String, To_Replace, Replace_With, Result) :-
    (    append([Front, To_Replace, Back], String)
    ->   append([Front, Replace_With, Back], R),
         replace_substring(Back, To_Replace, Replace_With, Result)
    ;    Result = String
    ).

【讨论】:

  • -> 使所有这些都与非关系...
猜你喜欢
  • 2014-11-05
  • 2022-01-07
  • 2015-10-08
  • 1970-01-01
  • 2017-07-02
  • 2013-05-18
  • 2011-10-10
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多