如何在Prolog中用另一个子列表搜索和替换列表?
我正试图通过搜索和替换来修改列表,我想知道如何在一个列表中同时搜索搜索词作为列表 假设我有一个列表[1,2,3,4],我想挑出2和3,用5,6代替 所以理想情况下我可以有一个谓词:如何在Prolog中用另一个子列表搜索和替换列表?,prolog,dcg,Prolog,Dcg,我正试图通过搜索和替换来修改列表,我想知道如何在一个列表中同时搜索搜索词作为列表 假设我有一个列表[1,2,3,4],我想挑出2和3,用5,6代替 所以理想情况下我可以有一个谓词: search_and_replace(Search_Term, Replace_Term, Target_List, Result_List). eg. search_and_replace([2,3], [5,6], [1,2,3,4], Result_List), write(Result_List). 假
search_and_replace(Search_Term, Replace_Term, Target_List, Result_List).
eg.
search_and_replace([2,3], [5,6], [1,2,3,4], Result_List), write(Result_List).
假设您想用另一个列表替换列表中的子序列子字符串 这里是一个一般的方法如何做到这一点。您可能需要插入 计划中的其他条件
replacement(A, B, Ag, Bg) :-
phrase((seq(S1),seq(A),seq(S2)), Ag),
phrase((seq(S1),seq(B),seq(S2)), Bg).
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
是的,这是可以优化一点-甚至它的终止属性
这会有好处的。但概念清晰是一个非常宝贵的价值
编辑:您的示例查询:
?- replacement([2,3], [5,6], [1,2,3,4], Xs).
Xs = [1, 5, 6, 4] ;
false.
您可以按如下方式使用append/2:
replace(ToReplace, ToInsert, List, Result) :-
once(append([Left, ToReplace, Right], List)),
append([Left, ToInsert, Right], Result).
使用或不使用一次/1取决于您是否需要所有可能的功能
要替换所有事件,我将使用以下内容:
replace(ToReplace, ToInsert, List, Result) :-
replace(ToReplace, ToInsert, List, [], Result).
replace(ToReplace, ToInsert, List, Acc, Result) :-
append([Left, ToReplace, Right], List),
append([Acc, Left, ToInsert], NewAcc),
!,
replace(ToReplace, ToInsert, Right, NewAcc, Result).
replace(_ToReplace, _ToInsert, [], Acc, Acc).
很好,DCG对我来说很新,但它似乎是一个优雅的解决方案。嗯。。我注意到谓词只搜索和替换一个,如何全局应用于所有术语?