这是我的代码:
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]
我怎样才能让它发挥作用。并感谢您的帮助。
答案 0 :(得分:0)
假设您希望div(L,N,L1,L2)
L1
是N
的第一个L
元素,而L2
仍然是剩下的:
div2(L,N,L1,L2) :-
length(L1,N),
append(L1,L2,L).
L
,L1
或L2
没有其他条件。
如果你希望在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
成功,则解决方案为P1
(P
与P1
统一)或递归调用div2
没有前缀P1
的第一个参数列表的剩余部分。
如果append
失败(如果分区元素N
的数量大于第一个参数列表长度,则会发生这种情况),则P
与第一个参数列表统一。