2016-09-06 34 views
2

我正在編寫一個模塊,它使用term_expansion/2來處理序言源文件。在這樣做的時候,我使用=..或使用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)沒有成功。

+5

使用ISO謂詞**'atom_concat/3' **連接原子。 – mat

+0

@mat你爲什麼不寫一個答案?如果在「擴展」名稱的相同模塊中碰巧存在一個謂詞,會發生什麼? (我知道這是使用term_expansion/2生成代碼的更普遍的問題)。是否這樣擴展發生在一個單獨的過程中,即擴展的代碼不會自動進一步擴展,即使有爲其定義的擴展? – 2016-09-07 09:30:11

+1

@Boris:我想吸引更多的海報來解決這個問題,我認爲這是一個很好的入門點,如元編程,術語擴展等許多重要的主題。如果我只是回答「使用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)). 

如果您需要翻譯任何仿函數,使用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).