我發誓這不是一個家庭作業問題。幾十年來我沒有上過課。曾幾何時我想出了分區功能,一個可愛的遞推公式:Prolog中兩個整數的遞歸定義函數(分區函數)
/0 (k > n)
f(k, n) { 1 (k = n)
\ p(k, n-k)+p(k+1, n) (k < n)
我想嘗試在序言中表示這一點。這是關於據我可以得到:
partition(N, N, 1) :- !. %% http://stackoverflow.com/a/9582409
partition(K, N, 0) :- K > N.
partition(K, N, A+B) :-
X is K+1,
Y is N-K,
partition(X, N, A),
partition(K, Y, B).
?- partition(1, 10, X).
給了我這樣的:
X = 1 + 0 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+ (1 + 0 + 0 + 0 +(1 + 0))+(1 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+(1 + 0 + 0 + 1 +(1 + 0 + 1 )))+(1 + 0 + 0 + 0 + 0 +(1 + 0)+(1 + 0 + 0 + 1)+(1 + 0 + 0 + 0 +(1 + 0)+(1 + 0 +0+(1 + 0)))+(1 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+(1 + 0 + 0 + 1 +(1 + 0 + 1))+(1 + 0 + 0 + 0 +(1 + 0)+(1 + 0 + 0 +(1 + 0))+(1 + 0 + 0 + 1 +(1 + 0 + 1)+(1 + 0 + 0 +(1 + 0)+(1 + 0 + 1 +(1 + 0 +(1 + 1))))))))?
有一件令人欣慰的事情是,在上述表達式(?)中的確有42個。我希望X=42.
注意問號。是的,有更多的比賽(顯然無限多)。第二個是:
X = 1 + 0 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+(1 + 0 + 0 + 0 +(1 + 0))+ 1 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+(1 + 0 + 0 + 1 +(1 + 0 + 1)))+(1 + 0 + 0 + 0 + 0 +(1 0)+(1 + 0 + 0 + 1)+(1 + 0 + 0 + 0 +(1 + 0)+(1 + 0 + 0 +(1 + 0)))+(1 + 0 + 0 + 0 + 1 +(1 + 0 + 0)+(1 + 0 + 0 + 1 +(1 + 0 + 1))+(1 + 0 + 0 + 0 +(1 + 0)+(1 + 0 +0+(1 + 0))+(1 + 0 + 0 + 1 +(1 + 0 + 1)+(1 + 0 + 0 +(1 + 0)+(1 + 0 + 1 +(1 + (0 + 0)+(1 + 1))))))))?
序言不會在你'分區(K,N,A + B)'條款頭部評估'A + B'。這只是Prolog中的一個術語。你需要'分區(K,N,R): - ...,R是A + B。 – lurker