2009-12-20 105 views
1

有沒有辦法「遞歸重新定義」(不知道技術術語)序言謂詞?序言:遞歸函數重定義

考慮這些謂詞:

f(X,Y,A):-A is Y xor X. 
arity(f,2). 

現在我想自動創建兩個新的謂詞F1/2和F2/1,定義如下:

f1(Y,A):-f(1,Y,A). 
f2(A):-f1(1,A). 

所以謂語應該得到一個(二進制)函數作爲輸入,並通過用1從左到右填充函數的參數(#通過arity定義)來創建新謂詞。

這可能嗎?我嘗試過univ運算符和call()的各種組合,但沒有成功。

有誰知道如何做到這一點?任何幫助真的會被讚賞。

編輯:對於較高的元數的一個例子:

f(W,X,Y,Z,A):-A is Y xor X xor W xor Z. 
arity(f,4). 

- >

f1(X,Y,Z,A):-f(1,X,Y,Z,A). 
f2(Y,Z,A):-f1(1,Y,Z,A). 
f3(Z,A):-f2(1,Z,A). 
f4(A):-f3(1,A). 

由於我在F(A)的返回值僅interrested與所有參數設置爲1有可能是一個更簡單的方法來做到這一點... 無論如何,感謝您的幫助!

+0

我對你以後的事情有點困惑。你能舉一個更高級的例子嗎?另外,您是否希望將新謂詞添加到prolog數據庫中以供立即使用,還是隻想將它們寫出到文本文件中? – nedned 2009-12-21 01:11:49

回答

3

term_expansion/2看看,它可以任意修改程序時,它由編譯器讀取。

雖然要小心,但這是一個強大的功能,你可以很容易地做出一個混亂的混亂。

0

我還沒有完全得到你的問題,但也許這可能是有益的:

t :- 
    assert(my_add(A,B,C):-C is A+B), 
    my_add(1,2,R), 
    writeln(R). 

測試:

?- t. 
3 
true.