更改prolog中谓词/函子的名称

更改prolog中谓词/函子的名称,prolog,Prolog,我正在编写一个模块,用于处理prolog源文件。在这样做时,我使用或将谓词解构为其名称。 例如: ?- functor(pred(foo, bar), N, _). N = pred. ?- pred(foo, bar) =.. L. L = [pred, foo, bar]. ?- term_expansion(pred(foo,bar),T). T = pred_expanded(foo, bar). 现在,我想将pred的名称更改为(例如)pred\u expanded,并将其再次作

我正在编写一个模块,用于处理prolog源文件。在这样做时,我使用或将谓词解构为其名称。 例如:

?- functor(pred(foo, bar), N, _).
N = pred.

?- pred(foo, bar) =.. L.
L = [pred, foo, bar].
?- term_expansion(pred(foo,bar),T).
T = pred_expanded(foo, bar).
现在,我想将
pred
的名称更改为(例如)
pred\u expanded
,并将其再次作为一个术语,以便
pred(foo,bar)
变成
pred\u expanded(foo,bar)

我尝试了
append(pred,“_expanded”,F)
append(pred,“_expanded”,F)
,但没有成功

change_functor(Term,NewFunctor,NewTerm) :-
    Term =.. [_|Args],
    NewTerm =.. [NewFunctor|Args].

term_expansion(Term,ExpandedTerm) :-
    functor(Term,pred,2),
    change_functor(Term,pred_expanded,ExpandedTerm).
例如:

?- functor(pred(foo, bar), N, _).
N = pred.

?- pred(foo, bar) =.. L.
L = [pred, foo, bar].
?- 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).

使用ISO谓词
atom\u concat/3
连接原子。@mat为什么不写一个答案呢?如果同一个模块中碰巧存在一个名为“expanded”的谓词,会发生什么?(我意识到,使用
术语扩展/2
生成代码时,这是一个更普遍的问题)。那么扩展是在一个过程中发生的吗?也就是说,扩展的代码不会自动进行进一步扩展,即使为它定义了扩展?@Boris:我想吸引更多的人关注这个问题,我认为这是很多重要主题的一个很好的切入点,比如元编程,术语扩展等。如果我简单地回答“使用atom_concat/3”,这一点立即被接受,那么整个问题很快就会被忘记,并且不太可能在这个机会讨论其他重要和相关的事情,如您提到的。尽管如此,我还是想帮助用户解决更紧迫的问题,所以我认为简短的评论最好能满足这两个要求。