prolog - prolog中的递归如何进行数字加法

标签 prolog

我的目标是获取 X 和 Y 之间的数字并产生 Z。

num_between(3,6, All)

例如,如果 X 为 3,Y 为 6,则 Z 是 X 和 Y 之间(包括 X 和 Y)之间的数字的列表。像 num_ Between(3,6,[3,4,5,6]) 这样的东西应该评估为 true。这是我到目前为止所拥有的:

num_between(0,0, []).
num_between(X,Y, All) :- 
  increase(X, New) ,           % increase number X++
  \+(X = Y) ,                  % check if  X is not equal to Y
  num_between(New,Y,[All|X]) . % requestion ???

increase(F,N) :- N is F+1 .

increase/1 正在工作并返回所需的数字,但是 当递归经过 num_ Between/3 时,它会熄灭: X 是 6 然后它会按照我想要的方式失败, 但我无法保留号码或归还号码。全部 = [3,4,5,6]。

全部 = 全部 + F。请有人帮忙。

最佳答案

您的基本子句不正确:由于您从未减少 XY,因此它们永远不会为零(除非 Y 从零开始,并且 X 从非正值开始)。基本子句应如下所示:

num_between(X, Y, []) :- X > Y.

这可以确保当用户输入无效的“向后”范围(例如,从 6 到 3)时,您会得到空结果。

现在到主子句:您需要做的就是检查范围是否有效,获取下一个值,然后进行递归调用,如下所示:

num_between(X, Y, [X|Tail]) :-
    X =< Y,
    Next is X + 1,
    num_between(Next, Y, Tail).

Demo.

您的原始代码在构造列表时出错 - 它尝试使用 X 作为列表的“尾部”,这是不正确的:

num_between(New,Y,[All|X]).

您将“扩展”后的结果“All”传递给递归调用链。应该是相反的 - 您需要传入 Tail 来收集结果,然后在递归调用结束时在其前面添加 X

关于prolog - prolog中的递归如何进行数字加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934662/

相关文章:

prolog - λProlog 拒绝假设的推理查询?

list - 计算 Prolog 中数字的连续出现次数

list - 如何比较序言中的两个列表,如果第二个列表由列表一的所有其他元素组成,则返回 true?

list - 序言not_member不做工作

sql - 比较 SQL 和 Prolog

prolog - 将 sin 函数的答案分配给序言中的 sin(X) 项

prolog - 用户定义的平方谓词

prolog - 约束规划,列表中数字的重复,序言

prolog - 无法在 Prolog 中定义谓词