如何以有限的谓词递归确定序言中的商?

时间:2019-04-24 20:18:31

标签: recursion prolog integer-division

因此,我一直在尝试仅通过使用内置谓词“ 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(Dividend,Dividend,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 :(得分:0)

我自己找到了解决方案:

div(0,0,_).

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