List 将列表一分为二

List 将列表一分为二,list,prolog,List,Prolog,尝试编写将列表拆分为偶数个元素的代码,例如split([1,2,3,4],a,B)将给出a=[1,2]和B=[3,4] 其行为类似于Javalist.length()/2将用于奇数个元素,因此split([1,2,3,4,5],A,B)将给出A=[1,2]和B=[3,4,5] 我能得到的最接近的结果是这样的,但这并不完全正确,只适用于偶数 split(L, A, B) :- append(A, B, L), length(A, N), length(B, N). 在Prolog中将

尝试编写将列表拆分为偶数个元素的代码,例如
split([1,2,3,4],a,B)
将给出
a=[1,2]
B=[3,4]

其行为类似于Java
list.length()/2
将用于奇数个元素,因此
split([1,2,3,4,5],A,B)
将给出
A=[1,2]
B=[3,4,5]

我能得到的最接近的结果是这样的,但这并不完全正确,只适用于偶数

split(L, A, B) :-
  append(A, B, L),
  length(A, N),
  length(B, N).

在Prolog中将列表一分为二的一种方法是使用
append/3
same_length/2
谓词:

split(List, Left, Right) :-
    same_length(Left, Right),
    append(Left, Right, List).
split(List, Left, [R|Rs]) :-
    same_length(Left, Rs),
    append(Left, [R|Rs], List).
这将为您提供:

| ?- split(L, A, B).
A = B, B = L, L = [] ;
A = [_1038],
B = [_1048],
L = [_1038, _1048] ;
A = [_1038, _1044],
B = [_1054, _1060],
L = [_1038, _1044, _1054, _1060] ;
A = [_1038, _1044, _1050],
B = [_1060, _1066, _1072],
L = [_1038, _1044, _1050, _1060, _1066, _1072] ;
...

在Prolog中将列表一分为二的一种方法是使用
append/3
same_length/2
谓词:

split(List, Left, Right) :-
    same_length(Left, Right),
    append(Left, Right, List).
split(List, Left, [R|Rs]) :-
    same_length(Left, Rs),
    append(Left, [R|Rs], List).
这将为您提供:

| ?- split(L, A, B).
A = B, B = L, L = [] ;
A = [_1038],
B = [_1048],
L = [_1038, _1048] ;
A = [_1038, _1044],
B = [_1054, _1060],
L = [_1038, _1044, _1054, _1060] ;
A = [_1038, _1044, _1050],
B = [_1060, _1066, _1072],
L = [_1038, _1044, _1050, _1060, _1066, _1072] ;
...

您可以使用条件形式
(somethingese;somethingese)
,来处理这两种情况(偶数和奇数)。您的问题根本不是针对SWI的。您可以使用条件形式
(somethingese;somethingese)
,来处理这两种情况(偶数和奇数)。您的问题根本不是针对SWI的。。您的定义可以具有更好的终止属性。当前:
split(A,B,C)在B(A)时终止;b(b)
那么
b(C)
呢?@false-ah-good-catch。肯定是拆分(L,A,[])的问题。。我会考虑这一点。现在第一个论点不影响终止。进展如何?(很遗憾,这是一个骗局…)顺便问一下,你用哪个顶级?有时它是_2343243丑陋的SWI,有时你有规则变量名
A,B,C…
@false是的,我可能也匆忙使用了这个解决方案。对于顶层,我通常默认为GNU Prolog。我有时会去SWI了解它提供的特定功能。在上面的例子中,当我运行代码并使用SWISH(基于SWI)时,我都无法访问这两种语言。我不得不“伪造”分号响应,因为SWISH使用按钮点击来表示“下一步”。你的定义可以有更好的终止属性。当前:
split(A,B,C)在B(A)时终止;b(b)
那么
b(C)
呢?@false-ah-good-catch。肯定是拆分(L,A,[])的问题。。我会考虑这一点。现在第一个论点不影响终止。进展如何?(很遗憾,这是一个骗局…)顺便问一下,你用哪个顶级?有时它是_2343243丑陋的SWI,有时你有规则变量名
A,B,C…
@false是的,我可能也匆忙使用了这个解决方案。对于顶层,我通常默认为GNU Prolog。我有时会去SWI了解它提供的特定功能。在上面的例子中,当我运行代码并使用SWISH(基于SWI)时,我都无法访问这两种语言。我不得不“伪造”分号回应,因为SWISH使用按钮点击来表示“下一步”。