我正在学习序言语言,对此有疑问。
我已经创建了一个程序,给定一个数字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]
来执行这些步骤:
我不想通过标准术语的实现来使用标准谓词。
答案 0 :(得分:1)
您的问题的解决方案可能是:
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