Замена атома переменной - PullRequest
0 голосов
/ 23 февраля 2019

Допустим, я хочу предикат, который заменяет атом 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...