Пролог - замена подтерм
Я делаю некоторые прошлые экзаменационные работы для практики для моего экзамена, и я столкнулся с вопросом, который я не совсем уверен, как решить:
Я знаю, что мне нужно использовать функцию «univ», чтобы разбить термин на список, а затем повторить этот список и проверить, совпадает ли какой-либо из элементов в списке с термином, который мы хотим заменить. Тем не менее, я немного растерялся с двойной рекурсией, когда список содержит еще один сложный термин, который мы должны разбить дальше. Моя попытка заключается в следующем:
complexTerm(X) :- nonvar(X), functor(X, _, A), A > 0.
replace(Term, Subterm, Subterm1, Term1) :-
Term =.. [H|T],
replaceSub([H|T], Subterm, Subterm1, Term1)
replaceSub([], Subterm, Subterm1, Term1).
replaceSub([H], Subterm, Subterm1, Term1) :-
atomic(X),
H == Subterm,
H = Subterm1.
replaceSub([H], Subterm, Subterm1, Term1) :-
complexTerm(H),
replace(H, Subterm, Subterm1, Term1).
replaceSub([H|T]) :- % not sure where to continue with this.
Любые указатели будут высоко оценены. Обратите внимание, что для экзамена мы не можем использовать внешние модули.
Спасибо за ваше время.