在Prolog中将列表拆分为两个长度相等的列表

use*_*088 2 prolog

我正在Prolog中编写一个谓词,将列表分成两个相等长度的列表.例如 :

div([1,2,3,4] , X , Y).
X = [1,2].
Y = [3,4].
Run Code Online (Sandbox Code Playgroud)

这是我的代码,但它不起作用:

div(L , L1 , L):- length(L) == length(L1).
div([ H | T ] , [ H | T1] , L2):- div(T , T1 , L2).
Run Code Online (Sandbox Code Playgroud)

Ser*_*nko 5

可能只是:

div(L, A, B) :-
    append(A, B, L),
    length(A, N),
    length(B, N).
Run Code Online (Sandbox Code Playgroud)

读作"附加列表A并且列表B导致原始列表L,A的长度是某个值N并且B的长度也是相同的值N".

  • 通过预先确定"A"和"B"的长度来"追加"可能更少的迭代:`div(L,A,B): - 长度(L,N),一半是N div 2,长度(A,一半) ),长度(B,半),追加(A,B,L).` (2认同)
  • 随着10 000个元素的列表,谢尔盖的代码:30 006推断0,140 CPU,潜伏者的代码5 015推断0,000 CPU! (2认同)

joe*_*l76 5

有趣的是这种分裂不使用长度:

div(L, A, B) :-
    split(L, L, A, B).

split(B, [], [], B).

split([H|T], [_, _|T1], [H | T2], B) :-
    split(T, T1, T2, B).
Run Code Online (Sandbox Code Playgroud)

对于100 000个元素的列表,它使用50 001推断但是0,016 CPU,对于相同的列表,潜伏者的代码使用50 015推断和0,000 CPU.