我发誓这不是一个家庭作业问题。几十年来我没有上过课。曾几何时我想出了分区功能,一个可爱的递推公式: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