2016-09-06 4 views
2

term_expansion/2を使用してプロローグソースファイルを処理するモジュールを作成しています。そうしている間に、私は=..を使って述語を解体するか、functor/3を使ってその名前に投影します。たとえば :プロローグ/ファンクタの名前をプロローグに変更

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

?- pred(foo, bar) =.. L. 
L = [pred, foo, bar]. 

は、今私はpred_expanded(例えば)にpredの名前を変更し、pred(foo, bar)pred_expanded(foo, bar)になるように、再度用語ようにしたいです。

私はappend(pred, "_expanded", F)append(pred, '_expanded', F)を試してみましたが、成功しませんでした。例えば

+5

使用ISO述語**原子を連結する 'atom_concat/3' ** – mat

+0

@matなぜ答えを書かないのですか?そして、同じモジュール内に "展開された"名前の述語が存在するとどうなりますか? (これは 'term_expansion/2'を使ってコードを生成するより一般的な問題です)。拡張が単一のパスで行われるように拡張コードが定義されていても、展開されたコードは自動的にそれ以上拡張されません。 –

+1

@Boris:私はメタプログラミング、用語拡張など、多くの重要なトピックの良いエントリーポイントであると思う以上のポスターを募集したいと思います。単に "use atom_concat/3"と答えればすぐに受け入れられれば、すぐに全体の質問が忘れられ、あなたが言及したような他の重要かつ関連することは、この機会に引き続き議論されることはありません。それにもかかわらず、私はユーザーに直ちに問題を直面させたいと考えています。そのため、両方の要件を満たすことが最善の方法です。 – mat

答えて

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

は "大学" 事前に定義された述語を使用する方法を示しています。しかし、これが最善の解決策です:

term_expansion(pred(A,B),pred_expanded(A,B)). 

あなたが/ 3 atom_concat使用し、任意のファンクタを翻訳する必要がある場合に述べたように前:

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). 
関連する問題