replacement(X, Y, TX, TY) :-
if_(X = TX, Y = TY, TX = TY).
Это заменяет один элемент, используя library(reif)
для SICStus или SWI .
Теперь нам нужно заменить все элементы, поэтому мы будем применять replacement/4
пару раз. Некоторая часть останется прежней, а часть изменится. На самом деле, первые два аргумента всегда будут одинаковыми, только последние два изменятся. Таким образом, мы могли бы написать call(replacement(X,Y), TX, TY)
. Фактически, теперь мы можем определить это отношение по деревьям независимо от нашего конкретного отношения замены:
maptree(_R_2, n, n).
maptree(R_2, n(TX, L0, R0), n(TY, L, R)) :-
call(R_2, TX, TY),
maptree(R_2, L0, L),
maptree(R_2, R0, R).
replace(X, Y, TX, TY) :-
maptree(replacement(X,Y), TX, TY).