假设我想要一个谓词,将谓词x替换为变量X,因此 像这样的东西:
replace(p(x,Y), Result)
...
Result = p(X,Y).
解决此问题的最佳方法是什么? 在规则主体中使用X会产生单例错误。
为了澄清我对X的值不感兴趣,我要寻找的是X的名称。
编辑
我发现这段代码基本上可以满足我的需求
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.