How do you do a search and replace of a list with another sublist in Prolog?

前端 未结 2 1513
耶瑟儿~
耶瑟儿~ 2020-12-07 02:54

I\'m trying to modify a list by search and replace, was wondering how do I search through a list with the search term as a list as well?

Lets say I have a list [1,2,

相关标签:
2条回答
  • 2020-12-07 03:09

    Let me assume that you want to replace a subsequence substring within a list by another list.

    Here is a general way how to do this. You might want to insert further conditions into the program.

    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).
    

    And, yes this can be optimized a bit - even its termination property would profit. But conceptual clarity is a quite precious value...

    Edit: Your example query:

    ?- replacement([2,3], [5,6], [1,2,3,4], Xs).
    Xs = [1, 5, 6, 4] ;
    false.
    
    0 讨论(0)
  • 2020-12-07 03:16

    You can use append/2 as follows :

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

    With or without use of once/1 depending on if you want all the possibilies or not.

    To replace all the occurences I'd go with something like :

    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).
    
    0 讨论(0)
提交回复
热议问题