5

我正在尝试通过搜索和替换来修改列表,想知道如何搜索包含搜索词作为列表的列表?

假设我有一个列表 [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).
4

2 回答 2

6

让我假设您想用另一个列表替换列表中的子序列子字符串。

这是执行此操作的一般方法。您可能希望在程序中插入更多条件。

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.
于 2011-11-29T14:44:45.210 回答
4

您可以使用append/2如下:

replace(ToReplace, ToInsert, List, Result) :-
    once(append([Left, ToReplace, Right], List)),
    append([Left, ToInsert, Right], Result).

使用或不使用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).
于 2011-11-29T14:48:25.410 回答