prolog - 生成列表并检查值是否在增加
问题描述
目前,我正在生成一个列表,其中每个元素的值等于前一个元素的平方加上 Z 的值。使用 generate_list 生成列表后,我想检查它是否是有序列表。我已经实现了ordered,然后在控制台中,我试图做一些类似ordered(generate_list(A, B, Z,[]). 的事情,它总是返回false,即使我确定它必须是真的。我知道这种方法在 Prolog 中不好,但我不知道该怎么做......
gen(0,0,_).
gen(N,F,Z) :- X is N-1,gen(X,A,Z),F is (A*A)+Z.
generate_list(A,B,Z,[]):- A>B.
generate_list(A,B,Z,[H|T]):-
A =< B,
gen(A,H,Z),
AA is A + 1,
generate_list(AA,B,Z,T).
ordered([]).
ordered([_]).
ordered([X,Y|Z]):-X=<Y,ordered([Y|Z]).
解决方案
我真的不明白你为什么gen/3
在这里指定一个函数。您可以使用accumulator,因此每次更新累加器,如:
generate_list(N, Z, L) :-
generate_list(N, Z, 0, L).
generate_list(0, _, _, []).
generate_list(N, Z, A, [A|T]) :-
N > 0,
B is A*A + Z,
N1 is N-1,
generate_list(N1, Z, B, T).
例如对于Z
is 1
,我们得到:
?- generate_list(5, 1, L).
L = [0, 1, 2, 5, 26] ;
false.
使用ordered/1
您问题中的谓词,我们看到该列表确实是有序的:
?- generate_list(5, 1, L), ordered(L).
L = [0, 1, 2, 5, 26] ;
false.
而对于Z = -1
,它不是:
?- generate_list(5, -1, L).
L = [0, -1, 0, -1, 0] ;
false.
?- generate_list(5, -1, L), ordered(L).
false.
推荐阅读
- windows - 随机批量停止服务无济于事
- f# - 仅在构建失败时调用 ActivateBuildFailureTarget
- javascript - 无法在循环中打开包含按钮的 CSS 模式
- vb.net - 我无法将登录用户的信息检索到 form2
- python - 随机挑选具有给定概率的项目
- javafx - JavaFX 媒体卷绑定
- nhibernate - 你将如何导出 NServiceBus 的 NHibernate Saga 映射?
- django - 如何在 django 中正确分配 through 属性?
- botframework - 如何获取组织中的 MS Teams 用户列表?
- r - 如果变量具有重复值,则从数据框中删除组