Prolog 将列表一分为二,其中第一个的长度给定

Prolog 将列表一分为二,其中第一个的长度给定,prolog,Prolog,我想创建一个函数,根据第一个列表的长度,我们将列表拆分为2。我真的停留在它的开头 split(L,0,[],L). 有什么想法吗?首先考虑描述你想要的结果。您可以将列表分为开始和结束,并且开始的长度应为长度 split(List, Length, Start, End) :- length(Start, Length), append(Start, End, List). 请注意,length和append的顺序将对效率产生影响。如果将append放在第一位,那么appen

我想创建一个函数,根据第一个列表的长度,我们将列表拆分为2。我真的停留在它的开头

split(L,0,[],L).

有什么想法吗?

首先考虑描述你想要的结果。您可以将
列表
分为
开始
结束
,并且
开始
的长度应为
长度

split(List, Length, Start, End) :-
    length(Start, Length),
    append(Start, End, List).


请注意,
length
append
的顺序将对效率产生影响。如果将
append
放在第一位,那么append将把
Start
列表的前零个元素统一起来,长度检查失败,然后将
Start
与第一个元素统一起来,然后是前两个,然后是三个,依此类推,直到它到达长度为
length
的前缀
List
。通过将
长度
目标放在第一位,可以避免所有这些明显的死胡同,这将从正确大小的列表开始

首先考虑描述你想要的结果。您可以将
列表
分为
开始
结束
,并且
开始
的长度应为
长度

split(List, Length, Start, End) :-
    length(Start, Length),
    append(Start, End, List).


请注意,
length
append
的顺序将对效率产生影响。如果将
append
放在第一位,那么append将把
Start
列表的前零个元素统一起来,长度检查失败,然后将
Start
与第一个元素统一起来,然后是前两个,然后是三个,依此类推,直到它到达长度为
length
的前缀
List
。通过将
长度
目标放在第一位,可以避免所有这些明显的死胡同,这将从正确大小的列表开始

使用长度/2和附加/3!(我参考先前的评论)。递归解决方案很好,但是使用length和append更容易。使用length/2和append/3优雅!(我参考先前的评论)。递归解决方案很好,但是使用长度和附加更容易。不错,但是交换这两个目标不是更好吗?@false肯定会。我将交换这些,并解释为什么一种方法更好。感谢您指出这一点。现在,目标终止,iff
Length
已知。也就是说,没有必要知道其他三个中的任何一个!相反,如果
append/3
是第一个目标,那么终止就更复杂了:必须知道
List
Start
的长度,而且,还有一些更奇特的情况,比如
List=[a | | uu],Start=[b | |
终止,但交换这两个进球不是更好吗?@这肯定是错的。我将交换这些,并解释为什么一种方法更好。感谢您指出这一点。现在,目标终止,iff
Length
已知。也就是说,没有必要知道其他三个中的任何一个!相反,如果
append/3
是第一个目标,那么终止就更复杂了:必须知道
List
Start
的长度——而且,还有一些更奇特的情况,比如
List=[a | | uu],Start=[b | |]
终止。