首页 > 解决方案 > 生成列表并检查值是否在增加

问题描述

目前,我正在生成一个列表,其中每个元素的值等于前一个元素的平方加上 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]).

标签: prolog

解决方案


我真的不明白你为什么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).

例如对于Zis 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.

推荐阅读