这是我在知识库中输入的事实,平均值采用列表并返回结果,但是当我提出查询时
“平均([],X)”。
它返回X = 0然后当我按下;它给了我零除数错误,我不明白为什么,我尝试在KB中提出以下4个事实
平均(0,0)。
平均([],0)。
平均(0 / 0,0)。
平均(0,0 / 0)。
答案 0 :(得分:1)
我不确定你要通过写0/0
来实现什么(事实上我不确定除了average([],0).
之外还有什么事实),但很明显将0除以0将导致除以零错误。
这就是你的问题。删除0/0
的出现,错误将消失。
答案 1 :(得分:1)
平均值/ 2的代码是什么? 假设当前代码是:
average(L,X):-
sumlist(L,Sum),
length(L,N),
X is Sum/N.
然后你应该输入这样的特殊情况:
average([],0).
average(L,X):-
sumlist(L,Sum),
length(L,N),
X is Sum/N.
这将有你描述的行为:“当我尝试提出查询平均值([],X)。它返回X = 0,这是真的但我仍然可以按;这给出0/0分割错误.. “
为避免第二个错误,如果列表为空,则应阻止prolog继续执行第二个子句。 你可以用切口做到这一点:
average([],0):-!.
average(L,X):-
sumlist(L,Sum),
length(L,N),
X is Sum/N.
或通过在划分
之前检查列表的长度average([],0):-!.
average(L,X):-
sumlist(L,Sum),
length(L,N),
N>0,
X is Sum/N.
答案 2 :(得分:0)
我不能评论thanosQR的答案(代表不足),但你可以通过模式匹配避免削减:
average([], 0).
average([H|T], X):-
sumlist([H|T], Sum),
length([H|T], N),
X is Sum / N.
或使用if -> then ; else
构造:
average(L, X):-
( L = [] ->
X = 0
; sumlist(L, Sum),
length(L, N),
X is Sum / N
).