我的目标是获取 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。请有人帮忙。
最佳答案
您的基本子句不正确:由于您从未减少 X
或 Y
,因此它们永远不会为零(除非 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).
您的原始代码在构造列表时出错 - 它尝试使用 X
作为列表的“尾部”,这是不正确的:
num_between(New,Y,[All|X]).
您将“扩展”后的结果“All”传递给递归调用链。应该是相反的 - 您需要传入 Tail
来收集结果,然后在递归调用结束时在其前面添加 X
。
关于prolog - prolog中的递归如何进行数字加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934662/