gpt4 book ai didi

prolog - 在 prolog 中的枢轴处将列表拆分为 2 个列表

转载 作者:行者123 更新时间:2023-12-02 16:35:26 25 4
gpt4 key购买 nike

我想在枢轴P处将一个列表分成2个列表,如果数字小于P,则进入L1,如果数字大于P,则进入L2。

这就是我到目前为止所拥有的,我能够以这种形式将列表 L 拆分为 L1 = [[],[]] 。但我想将列表分成 2 个列表 L1 和 L2,我该怎么做?

split(L,P,L1):-
split(L,P,[],L1).

split([],_,[],[]).
split([],_,X,[X]) :- X \= [].
split([P|T],P,[],L1) :- split(T,P,[],L1).
split([P|T],P,L,[L|L1]) :- L \= [], split(T,P,[],L1).
split([H|T],P,S,L1) :- H \= P, append(S, [H], S2), split(T,P,S2,L1).

最佳答案

您只需要三个规则即可实现此谓词:

:- use_module(library(clpfd)).

split([], _, [], []).
split([H|T], P, L1, [H|T2]) :-
H #>= P,
split(T, P, L1, T2).
split([H|T], P, [H|T1], L2) :-
H #< P,
split(T, P, T1, L2).

代码相当简单

请注意,由于 library(clpfd),此谓词也适用,例如当初始列表和枢轴未知时:

?- split(L,P,[5,47],[101]).
L = [101, 5, 47],
P in 48..101 ;
L = [5, 101, 47],
P in 48..101 ;
L = [5, 47, 101],
P in 48..101 ;
false.

使用partition/4

正如评论中提到的,您可以使用 partition/4为此:

split(L, P, L1, L2) :-
partition(zcompare(>,P), L, L1, L2).

但是,这不会表现出与第一个实现那么多不同的行为。

关于prolog - 在 prolog 中的枢轴处将列表拆分为 2 个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com