我应该在知识库中包含什么来告诉prolog 0/0的平均值为零以避免零除数?

时间:2011-10-29 23:44:37

标签: prolog

这是我在知识库中输入的事实,平均值采用列表并返回结果,但是当我提出查询时

“平均([],X)”。

它返回X = 0然后当我按下;它给了我零除数错误,我不明白为什么,我尝试在KB中提出以下4个事实

平均(0,0)。

平均([],0)。

平均(0 / 0,0)。

平均(0,0 / 0)。

3 个答案:

答案 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
    ).