我试图创建一个谓词,用这样的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)
但它取代了所有的发生。 任何提示都是受欢迎的。谢谢!
答案 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中实现的文字的扩展表示。