что я должен включить в базу знаний, чтобы сказать прологу, что среднее значение 0/0 равно нулю, чтобы избежать делителя нуля? - PullRequest
0 голосов
/ 30 октября 2011

это факты, которые я ввел в базу знаний, и среднее число берет список и возвращает результат, но когда я задаю запрос

"среднее ([], X)".

возвращает X = 0, затем, когда я нажимаю;это дает мне ошибку делителя нуля, и я не понимаю, почему, я попытался представить следующие 4 факта в КБ

среднее (0,0).

среднее ([], 0).

среднее (0 / 0,0).

среднее (0,0 / 0).

Ответы [ 3 ]

1 голос
/ 30 октября 2011

что такое код среднего / 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, что является истинным, но я все еще могу нажать; «

чтобы избежать второй ошибки, вы должны запретить прологу переходить ко второму предложению, если список пуст. Вы можете сделать это либо с разрезом:

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.
1 голос
/ 30 октября 2011

Я не уверен, чего вы пытаетесь достичь, написав 0/0 (на самом деле я не уверен, для чего нужны какие-либо факты, кроме average([],0).), но четко делю 0 на 0приведет к ошибке деления на ноль.

Так что это ваша проблема.Удалите вхождения 0/0, и ошибка исчезнет.

0 голосов
/ 18 июля 2014

Я не могу комментировать ответ 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
    ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...