我试图在Prolog中做一个平均值的谓词,但是我遇到了一些问题,
它被称为平均值(N,X),其中N是数字,X是从1到N的平均值的结果.
我试过这样做,但它并不总是很好用:
average(1,1).
average(N,X) :- K is N-1 ,K>1 , average(K,S1) , X is /(+(S1,N),N).
average(N,X) :- K is N-1 ,K=:=1 , average(K,S1) , X is +(S1,N).
Run Code Online (Sandbox Code Playgroud)
一些帮助 ?
让我们看一下1到n之和的一些平均值:
n = 1: 1/1 = 1
n = 2: (1+2)/2 = 3/2
n = 3: (1+2+3)/3 = 2
...
Run Code Online (Sandbox Code Playgroud)
现在在某种程度上感觉1和n之间的元素并不重要,总有1/2添加.所以我们假设(1 + ... n)/ n =(1 + n)/ 2.我们如何为一般的n证明这一点?让我们尝试归纳,即让我们展示我们可以从n = 0到n = 1进行基本步骤然后,假设我们的公式适用于任意n,我们证明公式也适用于n + 1.
步骤案例:我们假设(1 + ... + n)/ n =(1 + n)/ 2.我们还需要表明(1 + ... + n +(n + 1))/(n + 1)=(1+(n + 1))/ 2.我们可以将分数分成两部分:
(1+...+n+(n+1))/(n+1) =
(1+...+n)/(n+1) + (n+1)/(n+1) =
(1+...+n)/(n+1) + 1
Run Code Online (Sandbox Code Playgroud)
现在我们需要通过(n + 1)对除法做一些事情,所以让我们以不同的方式写出分数:
(1+...+n)/(n+1) + 1 =
(1+...+n)/n * (n/(n+1)) + 1
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用(1 + ... + n)/ n =(1 + n)/ 2的假设并简化:
(1+...+n)/n * (n/(n+1)) + 1 =
(1+n)/2 * (n/(n+1)) + 1 =
n/2 + 1 =
(n+2)/2 =
(1 + (n+1))/2
Run Code Online (Sandbox Code Playgroud)
这正是我们想要的!
现在让我们制作一个程序:
avg(N,X) :- X is (1+N)/2.
Run Code Online (Sandbox Code Playgroud)
它给出了预期的结果:
?- between(1,10,C), avg(C,X).
C = X, X = 1 ;
C = 2,
X = 1.5 ;
C = 3,
X = 2 ;
C = 4,
X = 2.5 ;
C = 5,
X = 3 ;
C = 6,
X = 3.5 ;
C = 7,
X = 4 ;
C = 8,
X = 4.5 ;
C = 9,
X = 5 ;
C = 10,
X = 5.5.
Run Code Online (Sandbox Code Playgroud)
而且,它比原始方法更有效!