在Prolog中多次拆分列表

时间:2016-12-29 20:57:10

标签: prolog

这是我的代码:

 div2(L,N,L1,L2) :-
  length(L1,N),%n=4
  append(L1,L2, L),
  L=L2,L1=[],L2=[].

我想让它每次在L1中显示一个4元素列表,但它返回false。 例如:

L=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
L1=[1,2,3,4]
L1=[5,6,7,8]
L1=[9,10,11,12]
L1=[13,14,15,16]

我怎样才能让它发挥作用。并感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

假设您希望div(L,N,L1,L2) L1N的第一个L元素,而L2仍然是剩下的:

div2(L,N,L1,L2) :-
    length(L1,N),
    append(L1,L2,L).

LL1L2没有其他条件。

如果你希望在4个元素的多个元素之后成为前4个元素,而其余的是L2,你需要这样说:

div2(L,N,L1,L2) :-
    append(L01,L2,L), % break up L
    length(L01,Nx),   % make sure prefix's length is multiple of N
    0 is mod(Nx,N),
    append(L0,L1,L01),% set L1 to be last N elements of prefix
    length(L1,N). 

答案 1 :(得分:0)

略有不同的解决方案......

div2([X|Xs], N, P) :-
    (   length(P1, N),
        append(P1, R, [X|Xs])
    ->  (   P = P1
        ;   div2(R, N, P)
        )
    ;   P = [X|Xs]
    ).

此解决方案定义了长度为P1的列表N,并尝试将其统一(append作为[X|Xs]的前缀列表。[X|Xs]使用而不是L来确保仅当第一个参数是包含至少一个元素的列表时谓词才会成功。)

如果append成功,则解决方案为P1PP1统一)或递归调用div2没有前缀P1的第一个参数列表的剩余部分。

如果append失败(如果分区元素N的数量大于第一个参数列表长度,则会发生这种情况),则P与第一个参数列表统一。