从Prolog中的String替换第n个子串出现

时间:2018-06-18 22:41:05

标签: prolog swi-prolog

我试图创建一个谓词,用这样的String替换第n个子串出现。

replace_word(zXyyyzXyyXzX, 2, zX, OO , Result)

所以如果我打电话给Result = zXyyyOOyyXzX我就可以

replace_word(Old, New, Orig, Replaced) :- atomic_list_concat(Split, Old, Orig), atomic_list_concat(Split, New, Replaced).

我尝试实现此实用程序

SELECT *
FROM DF1
WHERE 
Patient_alive='still_alive' 
AND Patient_ID in (SELECT Pat_ID from DF2)

但它取代了所有的发生。 任何提示都是受欢迎的。谢谢!

1 个答案:

答案 0 :(得分:0)

最近添加的call_nth / 2以及灵活的ISO谓词sub_atom / 5,可以实现干净的实施:

replace_nth_word(Word,NthOcurrence,ToReplace,ReplaceWith,Result) :-
    call_nth(sub_atom(Word,Before,_Len,After,ToReplace),NthOcurrence),
    sub_atom(Word,0,Before,_,Left), % get left part
    sub_atom(Word,_,After,0,Right), % get right part
    atomic_list_concat([Left,ReplaceWith,Right],Result).

显然,它也适用于字符串,这要归功于从版本7开始在SWI-Prolog中实现的文字的扩展表示。