【问题标题】:How do you do a search and replace of a list with another sublist in Prolog?你如何在 Prolog 中用另一个子列表搜索和替换一个列表?
【发布时间】:2018-06-06 20:04:27
【问题描述】:

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

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

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

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

    以下是执行此操作的一般方法。您可能想要插入 进一步的条件进入程序。

    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.
    

    【讨论】:

    • 非常好,DCG 对我来说很新,但它似乎是一个优雅的解决方案。
    【解决方案2】:

    您可以使用 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).
    

    【讨论】:

    • 嗯..我注意到谓词只搜索和替换一个,你如何应用于全局的所有术语?
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2022-01-21
    • 2013-08-26
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多