Я пытаюсь написать простую прологическую программу, которая должна заменить атом другим атомом. Программа может принимать комплексный функтор в качестве входного сигнала и заменяет все атомы другими атомами.Prolog: Заменить атом другим атомом в сложных терминах
например. В следующем выражении я хочу заменить атом а томом только там, где я сталкиваюсь с листом (т. Е. Не именем функтора).
replace(put(a,table,aside(a(dont,replace),a)),X).
, который должен производить выход,
X = put(ax,table,aside(a(dont,replace),ax));
false.
В приведенном выше выходе, заменял с топором всюду, за исключением имени функтора. В некотором смысле все листья заменяются. Но не внутренние узлы.
Я попытался следующим,
replace([],[]).
replace([H | T], [H1 | T1]):-
(
atom(H), (H == a) %If it's an atom and equal to a, then replace H1 with ax.
-> H1 = ax, replace(T, T1) %and recursively follow the same for T.
; H1 = H, T1 = T, replace(T, T1) %else keep things as it is and recurse.
).
replace(L, R):-
functor(L, F1, A1), %if it's a functor then don't do anything, just follow
functor(R, F1, A1), %for the args of the functor.
L =.. [F1 | Args1],
R =.. [F1 | Args2],
replace(Args1, Args2),!.
Задача 1. Я получаю неглубокий выход на тот же вход
replace(put(a,table,aside(ad,a,toe)),X).
X = put(ax,table,aside(ad,a,toe)).
ЗАДАЧА 2. Моего предикат провалится, когда арность изменений функторных. Например,
replace(put(a,table,aside(a(dont,replace),a)),X).
Undefined predicate: substit/2
Я понимаю, что мой подход может быть не лучшим. Может кто-то, пожалуйста, помогите мне либо исправить проблемы, либо предложить новый подход.
Спасибо.