我被要求在Prolog中执行一个程序,该程序必须能够用递归结构对偶数和奇数进行求和。该规则的形式如下:
sum(N,PairSum,OddSum)以N作为给定的数作为参数。例如:如果是N=5,那么PairSum=4+2和OddSum=5+3+1
我的代码如下
suma(0,0,0).
suma(N,SumPares,SumImpares) :-
N>0,
N1 is N -1,
suma(N1,SumaP,SumaI),
( (0 is mod(N,2))
-> SumPares is SumaP + (N-2)
; SumImpares is SumaI +(N-2)
).代码编译成功,当我运行它时,它会失败。例如,使用N=5
suma(5,SumaPares,SumaImpares)
我得到以下信息
错误:参数没有充分实例化错误: In: ERROR:
12 _9750为_9756+(2-2)
发布于 2020-04-16 13:27:38
在遵循@gusbro的建议并注入其他一些建议之后,我可以对这段代码进行适当的工作。键在基情况下是suma(2,2,1),而不是suma(0,0,0)。另一个问题是我在if子句中的求和是一个do N-2,我只需要把N放在一边,而不做任何减法。以下是工作代码:
suma(2,2,1).
suma(N,SumaPares,SumaImpares) :-
N>0,
N1 is N -1,
suma(N1,SumaP,SumaI),
( 0 is mod(N,2) ->
(SumaPares is SumaP + N, SumaImpares is SumaI)
; (SumaImpares is SumaI +N, SumaPares is SumaP)
).非常感谢你的帮助。
发布于 2020-04-12 04:43:31
在查阅此代码时,您应该会看到两个单例警告:SumaI和SumI只在过程summation/3的第二个子句正文中出现一次。
查看您的代码,您似乎希望使用相同的变量,因此将SumaI重命名为SumI。现在,在重新查看代码之后,您应该不会看到任何单例警告。
澄清后编辑
编辑之后,仍然有单例警告。除了键入之外,问题是您的条件分支分配了一个和变量,并保留了另一个变量。我相信你想要这样的东西:
suma(0,0,0).
suma(N,SumaPares,SumaImpares) :-
N>0,
N1 is N -1,
suma(N1,SumaP,SumaI),
( 0 is mod(N,2) ->
(SumaPares is SumaP + (N-2), SumaImpares=SumaI)
; (SumaImpares is SumaI +(N-2), SumaPares=SumaP)
).https://stackoverflow.com/questions/61166114
复制相似问题