Допустим, я хочу предикат, который заменяет атом x на переменную X, так что-то вроде этого:
replace(p(x,Y), Result)
...
Result = p(X,Y).
Каков наилучший способ решить эту проблему?Использование X в теле правила дает единственную ошибку.
Чтобы пояснить, что меня не интересует значение X, я ищу имя X.
edit
Я нашел этот код, который в основном делает то, что я ищу
replace(Term,Term,With,With) :-
!.
replace(Term,Find,Replacement,Result) :-
Term =.. [Functor|Args],
replace_args(Args,Find,Replacement,ReplacedArgs),
Result =.. [Functor|ReplacedArgs].
replace_args([],_,_,[]).
replace_args([Arg|Rest],Find,Replacement,[ReplacedArg|ReplacedRest]) :-
replace(Arg,Find,Replacement,ReplacedArg),
replace_args(Rest,Find,Replacement,ReplacedRest).
Он имеет желаемое поведение, когда я вызываю его из оболочки
?- replace(x,x,X,Result).
X = Result.
Но я возвращаюсь к исходной точке при вызове изнутри программы
...code...
replace(x,x,X,Result)
X - переменная-одиночка, и результат равен
true.