我正在尝试通过搜索和替换来修改列表,我想知道如何搜索列表中的搜索词作为列表?
让我说我有一个列表[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).
Run Code Online (Sandbox Code Playgroud)
我假设您要将列表中的子序列子字符串替换为另一个列表.
以下是如何执行此操作的一般方法.您可能希望在程序中插入更多条件.
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).
Run Code Online (Sandbox Code Playgroud)
并且,是的,这可以进行一些优化 - 甚至它的终止属性也会获利.但概念清晰度是一个非常宝贵的价值......
编辑:您的示例查询:
?- replacement([2,3], [5,6], [1,2,3,4], Xs).
Xs = [1, 5, 6, 4] ;
false.
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用append/2:
replace(ToReplace, ToInsert, List, Result) :-
once(append([Left, ToReplace, Right], List)),
append([Left, ToInsert, Right], Result).
Run Code Online (Sandbox Code Playgroud)
使用或不使用once/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).
Run Code Online (Sandbox Code Playgroud)