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

Posted

技术标签:

【中文标题】如何使用有限谓词递归确定序言中的商?【英文标题】:How to recursively determine quotient in prolog with limited predicates? 【发布时间】:2019-04-24 20:18:31 【问题描述】:

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

我很快想出了一个解决方案,但由于某种原因它无法按预期工作。它一直给我同样的错误,我只是不知道我做错了什么。我是序言的新手。由于大学,我必须研究它。

这是我正在尝试的:

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】:

我自己找到了解决方案:

div(0,0,_).

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

【讨论】:

以上是关于如何使用有限谓词递归确定序言中的商?的主要内容,如果未能解决你的问题,请参考以下文章

将序言中的列表拆分为原子和整数

使用有限域声明降序/升序坐标的谓词

如何基于谓词实现列表拆分器

如何迭代或递归确定二维数组中的邻居?

如何在 Java 中动态构造谓词

通过给出可能的移动,在列表中移动。序言