与条件列表n个序言名单

问题描述 投票:0回答:1

我正在学习序言语言,我有一个关于这个问题的问题。

我已经创建了一个程序,给定一个数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..in这种情况下[0,1]
  • 检查5 <2我不创造什么。
  • 检查2 <3 I创建的2 list2val ... [0,1,2]
  • 等等...

我不想用一个标准谓词,通过与标准条款执行。

prolog
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.