如何用有限的谓词递归确定prolog中的商?

问题描述 投票:0回答:1

所以我一直试图通过仅使用内置谓词“is”,“*”,“+”和“ - ”来确定prolog中整数的商。它期望商是一个整数,所以我不需要任何小数或休息。

我很快想出了一个解决方案,但由于某种原因,它不会按预期工作。它一直给我同样的错误,我无法弄清楚我做错了什么。我是prolog btw的新手。由于大学,我必须调查它。

这是我正在尝试的:

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,直到它在第一次调用时回来但不会。顺便说一下,我必须使用这个签名作为我的谓词。这是大学的一项任务。任何帮助表示赞赏!

recursion prolog integer-division
1个回答
0
投票

我自己找到了解决方案:

div(0,0,_).

div(Quotient, Dividend, Divisor) :- 
    Rest is Dividend - Divisor,
    div(NewQuotient, Rest, Divisor),
    Quotient is NewQuotient + 1.
© www.soinside.com 2019 - 2024. All rights reserved.