具有条件的清单n的序言清单

时间:2019-02-01 11:54:23

标签: prolog

我正在学习序言语言,对此有疑问。

我已经创建了一个程序,给定一个数字N,该程序返回一个列表,其中元素在0N之间:

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]来执行这些步骤:

  • 检查1 <5,所以我创建一个1 list2val直到1 ..在这种情况下为[0,1]
  • 检查5 <2,我什么也没创造。
  • 检查2 <3我创建2的list2val ... [0,1,2]
  • 依此类推...

我不想通过标准术语的实现来使用标准谓词。

1 个答案:

答案 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