Как рекурсивно определить частное в прологе с ограниченными предикатами? - PullRequest
0 голосов
/ 24 апреля 2019

Итак, я пытался определить частное от целых чисел в прологе, используя только предикаты build "is", "*", "+" и "-".Он ожидает, что частное будет целым числом, поэтому мне не нужны никакие десятичные дроби или остатки.

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

Вот что я пытаюсь:

div(0, 0, _).
div(1, Dividend, Dividend).

div(Quotient, Dividend, Divisor) :- 
    NewDividend is Dividend - Divisor,
    div(NewQuotient, NewDividend , Divisor),
    NewQuotient + 1 is Quotient.

Я в основном пытался что-нибудь от обмена вещами до добавления большего количества предикатов, таких как "div(Дивиденд, Дивиденд, 1). ".

Вот что я показываю, когда я набираю div (Y, 15, 3).

ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:   [13] 0+1 is _2768
ERROR:   [12] div(_2798,3,3) at div.pl:63
ERROR:   [11] div(_2826,6,3) at div.pl:63
ERROR:   [10] div(_2854,9,3) at div.pl:63
ERROR:    [9] div(_2882,12,3) at div.pl:63
ERROR:    [8] div(_2910,15,3) at div.pl:63
ERROR:    [7] <user>

Я вроде понимаю, чего хотят ошибкискажи мне, но я просто не понимаю, почему это не сработает, потому что я ожидаю, что это сработает.Получается, что коэффициент равен 0, если дивиденд равен 0, и с этого момента он должен просто добавить 1 с, пока он не вернется при первом вызове, но не будет.Кстати, я должен использовать эту подпись для своего предиката.Это задание из университета.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 24 апреля 2019

Я сам нашел решение:

div(0,0,_).

div(Quotient, Dividend, Divisor) :- 
    Rest is Dividend - Divisor,
    div(NewQuotient, Rest, Divisor),
    Quotient is NewQuotient + 1.
...