在prolog中更改谓词/仿函数的名称

时间:2016-09-06 09:21:53

标签: prolog

我正在编写一个使用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)但没有成功。

1 个答案:

答案 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).