英文:
Prolog: Calculate summation by recursive function
问题
我必须在Prolog中编写一个递归函数,给定两个整数X>0和N>=2,计算以下和:
您编写的代码如下:
sum(1,2,9).
sum(X,N,Y):-
X>1,
N>2,
N1 is N-1,
sum(X,N1,Y1),
Y is Y1 + (((4*X+N)^2)/2*N).
?- sum(3,4,Y).
false, unexpected. % why?
我弄不清楚我错在哪里。
英文:
I have to write a recursive function in prolog which, given two integers X>0 and N>=2, calculates the following sum:
The code I wrote is as follows:
sum(1,2,9).
sum(X,N,Y):-
X>1,
N>2,
N1 is N-1,
sum(X,N1,Y1),
Y is Y1 + (((4*X+N)^2)/2*N).
?- sum(3,4,Y).
false, unexpected. % why?
I can't figure out where I'm wrong.
答案1
得分: 2
为了查明程序失败的原因,通常有助于将程序进行泛化。如果泛化本身失败了,那么错误必须在剩下的部分中。我尝试了:
:- op(950, fy, *).
*(_).
sum(1,2,9).
sum(X,N,Y):-
X > 1,
N > 2,
N1 is N-1,
sum(X,N1,Y1),
* <s>Y is Y1 + (((4*X+N)^2)/2*N)</s>.
?- sum(3,4, Y).
false, unexpected. % 仍然失败
因此,求和项的公式与此错误无关。
请注意第一个参数及其变量 X
。它总是相同的。因此,事实中的值 3
和值 1
确保永远不会有解。
英文:
To see why a program fails, it often helps to generalize the program. And if that generalization itself fails, then an error must be in the remaining part. I tried:
<pre>
:- op(950, fy, *).
*(_).
sum(1,2,9).
sum(X,N,Y):-
X>1,
N>2,
N1 is N-1,
sum(X,N1,Y1),
- <s>Y is Y1 + (((4X+N)^2)/2N)</s>.
?- sum(3,4, Y).
false, unexpected. % still fails
</pre>
So the formula for the summand is unrelated to this error.
Note the first argument and its variable X
. It is always the same. Thus the value 3
and the value 1
in the fact ensure that there will never be a solution.
答案2
得分: 1
I would write the function being summed as
f(I,X,V) :- V is (4 * X + I)**2 / (2*I) .
making it trivial to test:
?- f(3,4,V)
V = 49
Once you have that, write your recursive predicate, something like this:
% this exists solely to enforce the constraints
% - X must be a number
% - N must be an integer greater than or equal to 2
%
% it then invokes a helper predicate, seeing that with an initial value for
% the accumulator.
sum(N,X,S) :-
number(X),
integer(N),
N >= 2,
sum(N,X,0,S)
.
The helper predicate, sum/4
looks like this:
sum(I,X,T,S) :-
I >= 2,
f(I,X,V),
T1 is T+V,
I1 is I-1,
sum(I1,X,T1,S) .
sum(1,_,S,S) .
英文:
I would write the function being summed as
f(I,X,V) :- V is (4 * X + I)**2 / (2*I) .
making it trivial to test:
?- f(3,4,V)
V = 49
Once you have that, write your recursive predicate, something like this:
% this exists solely to enforce the constraints
% - X must be a number
% - N must be an integer greater than or equal to 2
%
% it then invokes a helper predicate, seeing that with an initial value for
% the accumulator.
sum(N,X,S) :-
number(X),
integer(N),
N >= 2,
sum(N,X,0,S)
.
The helper predicate, sum/4
looks like this:
sum(I,X,T,S) :-
I >= 2,
f(I,X,V),
T1 is T+V,
I1 is I-1,
sum(I1,X,T1,S) .
sum(1,_,S,S) .
https://swish.swi-prolog.org/p/DfKjFjMd.pl
</details>
# 答案3
**得分**: 0
一种方法是使用库,例如 SWI-Prolog 的 library(aggregate)。一种方法是这样做:
```prolog
my_function(X, I, R) :-
R is (4*X + I)^2 / (2*I).
summation(Lower, Upper, Fun, Sum) :-
aggregate_all(sum(R),
( between(Lower, Upper, I),
call(Fun, I, R)
),
Sum).
使用这个:
?- summation(2, 4, my_function(3), S).
S = 118.5.
英文:
One way to do it is to use a library, for example SWI-Prolog's library(aggregate). One way to do it:
my_function(X, I, R) :-
R is (4*X + I)^2 / (2*I).
summation(Lower, Upper, Fun, Sum) :-
aggregate_all(sum(R),
( between(Lower, Upper, I),
call(Fun, I, R)
),
Sum).
With this:
?- summation(2, 4, my_function(3), S).
S = 118.5.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论