我正在编写一个使用term_expansion/2
来处理prolog源文件的模块。在这样做的同时,我使用=..
解构谓词,或使用functor/3
将项目命名为其名称。
例如:
?- functor(pred(foo, bar), N, _).
N = pred.
?- pred(foo, bar) =.. L.
L = [pred, foo, bar].
现在我想将pred
的名称更改为(例如)pred_expanded
并再次将其设为一个术语,以便pred(foo, bar)
变为pred_expanded(foo, bar)
。
我尝试了append(pred, "_expanded", F)
和append(pred, '_expanded', F)
但没有成功。
答案 0 :(得分:1)
change_functor(Term,NewFunctor,NewTerm) :-
Term =.. [_|Args],
NewTerm =.. [NewFunctor|Args].
term_expansion(Term,ExpandedTerm) :-
functor(Term,pred,2),
change_functor(Term,pred_expanded,ExpandedTerm).
例如:
?- term_expansion(pred(foo,bar),T).
T = pred_expanded(foo, bar).
说明如何使用" univ"预定义谓词。但是,这是最好的解决方案:
term_expansion(pred(A,B),pred_expanded(A,B)).
如果您需要翻译任何仿函数,请按照前面的说明使用atom_concat / 3:
term_expansion(Term,ExpandedTerm) :-
functor(Term,F,_),
atom_concat(F,'_expanded',NewF),
change_functor(Term,NewF,ExpandedTerm).
示例:
?- term_expansion(kk(1,2,3),N).
N = kk_expanded(1, 2, 3).