我正在学习序言语言,我有一个关于这个问题的问题。
我已经创建了一个程序,给定一个数N
,返回与0
和N
之间元素的列表:
list2val(N,L):- list2val(0,N,L).
list2val(N,N,[N]).
list2val(C,N,[C|T]):-
C<N,
N1 is C+1,
list2val(N1,N,T).
?- list2val(5,X).
X = [0,1,2,3,4,5]
现在,我想给一个扩展,给定一个列表,返回一个列表的列表,其中每个列表list2val
只有在接下来的数小于当前数量。在这种情况下:
?- newFuction([1,5,2,3,9],L).
L = [[0,1],[0,1,2,],[0,1,2,3]]
我的代码是这样的,但是有些事情是错误的:
array(X):- array(X,_L).
array([],_L).
array([H|[T|Ts]],L1):-
H<T,
list2val(H,L2),
array([T|Ts],[L1|[L2]]).
array([T|Ts],L1).
也许可能是太难懂,但使用列表L = [1,5,2,3,9]
我做的那些步骤:
我不想用一个标准谓词,通过与标准条款执行。
一种用于你的问题的解决方案可能是:
list2val(N,L):- list2val(0,N,L).
list2val(N,N,[N]):- !.
list2val(C,N,[C|T]):-
C<N,
N1 is C+1,
list2val(N1,N,T).
simulate([_],[]).
simulate([A,B|T],[H|T1]):-
( A < B ->
list2val(A,H),
simulate([B|T],T1);
simulate([B|T],[H|T1])
).
使用像simulate/2
谓词,可以解决你的问题:它比较列表的两个数字,然后创建一个新的列表中的情况下满足条件。
?- simulate([1,5,2,3,9],LO).
LO = [[0, 1], [0, 1, 2], [0, 1, 2, 3]]
false