Prolog substitution

前端 未结 5 1280
囚心锁ツ
囚心锁ツ 2021-01-22 21:32

How can I replace a list with another list that contain the variable to be replaced. for example

rep([x, d, e, z, x, z, p], [x=z, z=x, d=c], R).
R = [z, c, e, x,         


        
5条回答
  •  星月不相逢
    2021-01-22 21:38

    I find your code rather confused. For one thing, you have rep/3 and rep/4, but none of them have a list in the second position where you're passing the list of variable bindings. H1=H2 cannot possibly match a list, and that's the only rep/3 clause that examines the second argument. If this is a class assignment, it looks like you're a little bit behind and I'd suggest you spend some time on the previous material.

    The solution is simpler than you'd think:

    rep([], _, []).
    rep([X|Xs], Vars, [Y|Rest]) :-    member(X=Y, Vars), rep(Xs, Vars, Rest).
    rep([X|Xs], Vars, [X|Rest]) :- \+ member(X=_, Vars), rep(Xs, Vars, Rest).
    

    We're using member/2 to find a "variable binding" in the list (in quotes because these are atoms and not true Prolog variables). If it's in the list, Y is the replacement, otherwise we keep using X. And you see this has the desired effect:

    ?- rep([x, d, e, z, x, z, p], [x=z, z=x, d=c], R).
    R = [z, c, e, x, z, x, p] ;
    false.
    

    This could be made somewhat more efficient using "or" directly (and save us a choice point):

    rep([], _, []).
    rep([X|Xs], Vars, [Y|Ys]) :- 
      (member(X=Y, Vars), ! ; X=Y), 
      rep(Xs, Vars, Ys).
    

    See:

    ?- rep([x, d, e, z, x, z, p], [x=z, z=x, d=c], R).
    R = [z, c, e, x, z, x, p].
    

提交回复
热议问题