:- module tree234.
:- use_module assoc_list, bool, builtin, int, list, private_builtin, require, std_util, term.
:- type (tree234:tree234(K, V))
	--->	empty
	;	two(K, V, (tree234:tree234(K, V)), (tree234:tree234(K, V)))
	;	three(K, V, K, V, (tree234:tree234(K, V)), (tree234:tree234(K, V)), (tree234:tree234(K, V)))
	;	four(K, V, K, V, K, V, (tree234:tree234(K, V)), (tree234:tree234(K, V)), (tree234:tree234(K, V)), (tree234:tree234(K, V)))
	.
:- inst ((tree234:four(K, V, T))) = bound(four(K, V, K, V, K, V, T, T, T, T)).
:- inst ((tree234:three(K, V, T))) = bound(three(K, V, K, V, T, T, T)).
:- inst ((tree234:two(K, V, T))) = bound(two(K, V, T, T)).
:- inst ((tree234:uniq_four(K, V, T))) = unique(four(K, V, K, V, K, V, T, T, T, T)).
:- inst ((tree234:uniq_three(K, V, T))) = unique(three(K, V, K, V, T, T, T)).
:- inst ((tree234:uniq_two(K, V, T))) = unique(two(K, V, T, T)).
:- mode ((tree234:di_four)) :: builtin:di(tree234:uniq_four(unique, unique, unique)).
:- mode ((tree234:di_three)) :: builtin:di(tree234:uniq_three(unique, unique, unique)).
:- mode ((tree234:di_two)) :: builtin:di(tree234:uniq_two(unique, unique, unique)).
:- mode ((tree234:in_four)) :: builtin:in(tree234:four(ground, ground, ground)).
:- mode ((tree234:in_three)) :: builtin:in(tree234:three(ground, ground, ground)).
:- mode ((tree234:in_two)) :: builtin:in(tree234:two(ground, ground, ground)).
:- mode ((tree234:out_two)) :: builtin:out(tree234:two(ground, ground, ground)).
:- mode ((tree234:sdi_four)) :: builtin:di(tree234:uniq_four(ground, ground, (tree234:uniq_tree234_gg))).
:- mode ((tree234:sdi_three)) :: builtin:di(tree234:uniq_three(ground, ground, (tree234:uniq_tree234_gg))).
:- mode ((tree234:sdi_two)) :: builtin:di(tree234:uniq_two(ground, ground, (tree234:uniq_tree234_gg))).
:- mode ((tree234:suo_two)) :: builtin:out(tree234:uniq_two(ground, ground, (tree234:uniq_tree234_gg))).
:- mode ((tree234:uo_two)) :: builtin:out(tree234:uniq_two(unique, unique, unique)).
:- pred tree234:delete_2((tree234:tree234(K_1, V_2)), K_1, (tree234:tree234(K_1, V_2)), (bool:bool)).
:- mode tree234:delete_2((builtin:di), (builtin:in), (builtin:uo), (builtin:out)) is det.
:- mode tree234:delete_2((builtin:in), (builtin:in), (builtin:out), (builtin:out)) is det.
:- pred tree234:remove_2((tree234:tree234(K_1, V_2)), K_1, V_2, (tree234:tree234(K_1, V_2)), (bool:bool)).
:- mode tree234:remove_2((builtin:di), (builtin:in), (builtin:uo), (builtin:uo), (builtin:out)) is semidet.
:- mode tree234:remove_2((builtin:in), (builtin:in), (builtin:out), (builtin:out), (builtin:out)) is semidet.
:- pred tree234:remove_smallest_2((tree234:tree234(K_1, V_2)), K_1, V_2, (tree234:tree234(K_1, V_2)), (bool:bool)).
:- mode tree234:remove_smallest_2((builtin:di), (builtin:uo), (builtin:uo), (builtin:uo), (builtin:out)) is semidet.
:- mode tree234:remove_smallest_2((builtin:in), (builtin:out), (builtin:out), (builtin:out), (builtin:out)) is semidet.
:- pred tree234:keys_2((tree234:tree234(K_1, V_2)), (list:list(K_1)), (list:list(K_1))).
:- mode tree234:keys_2((builtin:in), (builtin:in), (builtin:out)) is det.
:- pred tree234:values_2((tree234:tree234(K_1, V_2)), (list:list(V_2)), (list:list(V_2))).
:- mode tree234:values_2((builtin:in), (builtin:in), (builtin:out)) is det.
:- pred tree234:assoc_list_to_tree234_2((list:list((std_util:pair(K_1, V_2)))), (tree234:tree234(K_1, V_2)), (tree234:tree234(K_1, V_2))).
:- mode tree234:assoc_list_to_tree234_2((builtin:in), (builtin:in), (builtin:out)) is det.
:- pred tree234:tree234_to_assoc_list_2((tree234:tree234(K_1, V_2)), (list:list((std_util:pair(K_1, V_2)))), (list:list((std_util:pair(K_1, V_2))))).
:- mode tree234:tree234_to_assoc_list_2((builtin:in), (builtin:in), (builtin:out)) is det.
tree234:init((tree234:empty)).
tree234:init = T_2 :-
		tree234:init(T_2).
tree234:is_empty(Tree_2) :-
		Tree_2 = tree234:empty.
tree234:lookup(T_4, K_5) = V_6 :-
		tree234:lookup(T_4, K_5, V_6).
tree234:set(T1_5, K_6, V_7) = T2_8 :-
		tree234:set(T1_5, K_6, V_7, T2_8).
tree234:delete(Tin_4, K_5, Tout_6) :-
		tree234:delete_2(Tin_4, K_5, Tout_6, V_7).
tree234:delete(T1_4, K_5) = T2_6 :-
		tree234:delete(T1_4, K_5, T2_6).
tree234:remove(Tin_5, K_6, V_7, Tout_8) :-
		tree234:remove_2(Tin_5, K_6, V_7, Tout_8, V_9).
tree234:remove_smallest(Tin_5, K_6, V_7, Tout_8) :-
		tree234:remove_smallest_2(Tin_5, K_6, V_7, Tout_8, V_9).
tree234:keys(Tree_3, Keys_4) :-
		V_5 = list:[],
		tree234:keys_2(Tree_3, V_5, Keys_4).
tree234:keys(T_3) = Ks_4 :-
		tree234:keys(T_3, Ks_4).
tree234:values(Tree_3, Values_4) :-
		V_5 = list:[],
		tree234:values_2(Tree_3, V_5, Values_4).
tree234:values(T_3) = Vs_4 :-
		tree234:values(T_3, Vs_4).
tree234:count(T_3) = N_4 :-
		tree234:count(T_3, N_4).
tree234:assoc_list_to_tree234(AssocList_3, Tree_4) :-
		V_5 = tree234:empty,
		tree234:assoc_list_to_tree234_2(AssocList_3, V_5, Tree_4).
tree234:assoc_list_to_tree234(AL_3) = T_4 :-
		tree234:assoc_list_to_tree234(AL_3, T_4).
tree234:tree234_to_assoc_list(Tree_3, AssocList_4) :-
		V_5 = list:[],
		tree234:tree234_to_assoc_list_2(Tree_3, V_5, AssocList_4).
tree234:tree234_to_assoc_list(T_3) = AL_4 :-
		tree234:tree234_to_assoc_list(T_3, AL_4).
tree234:foldl(_Pred_5, (tree234:empty), Acc_6, Acc_6).
tree234:foldl(Pred_7, (tree234:two(K_8, V_9, T0_10, T1_11)), Acc0_12, Acc_13) :-
		tree234:foldl(Pred_7, T0_10, Acc0_12, Acc1_14),
		call(Pred_7, K_8, V_9, Acc1_14, Acc2_15),
		tree234:foldl(Pred_7, T1_11, Acc2_15, Acc_13).
tree234:foldl(Pred_16, (tree234:three(K0_17, V0_18, K1_19, V1_20, T0_21, T1_22, T2_23)), Acc0_24, Acc_25) :-
		tree234:foldl(Pred_16, T0_21, Acc0_24, Acc1_26),
		call(Pred_16, K0_17, V0_18, Acc1_26, Acc2_27),
		tree234:foldl(Pred_16, T1_22, Acc2_27, Acc3_28),
		call(Pred_16, K1_19, V1_20, Acc3_28, Acc4_29),
		tree234:foldl(Pred_16, T2_23, Acc4_29, Acc_25).
tree234:foldl(Pred_30, (tree234:four(K0_31, V0_32, K1_33, V1_34, K2_35, V2_36, T0_37, T1_38, T2_39, T3_40)), Acc0_41, Acc_42) :-
		tree234:foldl(Pred_30, T0_37, Acc0_41, Acc1_43),
		call(Pred_30, K0_31, V0_32, Acc1_43, Acc2_44),
		tree234:foldl(Pred_30, T1_38, Acc2_44, Acc3_45),
		call(Pred_30, K1_33, V1_34, Acc3_45, Acc4_46),
		tree234:foldl(Pred_30, T2_39, Acc4_46, Acc5_47),
		call(Pred_30, K2_35, V2_36, Acc5_47, Acc6_48),
		tree234:foldl(Pred_30, T3_40, Acc6_48, Acc_42).
tree234:foldl(F_5, T_6, A_7) = B_8 :-
		P_9 = (pred(V_17::(builtin:in), V_16::(builtin:in), V_15::(builtin:in), V_14::(builtin:out)) is det :-
			some [] (
				V_17 = W_18,
				V_16 = X_19,
				V_15 = Y_20,
				V_14 = Z_21,
				Z_21 = apply(F_5, W_18, X_19, Y_20)
			)
		),
		tree234:foldl(P_9, T_6, A_7, B_8).
tree234:foldl2(_Pred_7, (tree234:empty), A_8, A_8, DCG_0_9, DCG_1_10) :-
		DCG_0_9 = DCG_1_10.
tree234:foldl2(Pred_11, (tree234:two(K_12, V_13, T0_14, T1_15)), A0_16, A_17, DCG_0_20, DCG_3_23) :-
		tree234:foldl2(Pred_11, T0_14, A0_16, A1_18, DCG_0_20, DCG_1_21),
		call(Pred_11, K_12, V_13, A1_18, A2_19, DCG_1_21, DCG_2_22),
		tree234:foldl2(Pred_11, T1_15, A2_19, A_17, DCG_2_22, DCG_3_23).
tree234:foldl2(Pred_24, (tree234:three(K0_25, V0_26, K1_27, V1_28, T0_29, T1_30, T2_31)), A0_32, A_33, DCG_0_38, DCG_5_43) :-
		tree234:foldl2(Pred_24, T0_29, A0_32, A1_34, DCG_0_38, DCG_1_39),
		call(Pred_24, K0_25, V0_26, A1_34, A2_35, DCG_1_39, DCG_2_40),
		tree234:foldl2(Pred_24, T1_30, A2_35, A3_36, DCG_2_40, DCG_3_41),
		call(Pred_24, K1_27, V1_28, A3_36, A4_37, DCG_3_41, DCG_4_42),
		tree234:foldl2(Pred_24, T2_31, A4_37, A_33, DCG_4_42, DCG_5_43).
tree234:foldl2(Pred_44, (tree234:four(K0_45, V0_46, K1_47, V1_48, K2_49, V2_50, T0_51, T1_52, T2_53, T3_54)), A0_55, A_56, DCG_0_63, DCG_7_70) :-
		tree234:foldl2(Pred_44, T0_51, A0_55, A1_57, DCG_0_63, DCG_1_64),
		call(Pred_44, K0_45, V0_46, A1_57, A2_58, DCG_1_64, DCG_2_65),
		tree234:foldl2(Pred_44, T1_52, A2_58, A3_59, DCG_2_65, DCG_3_66),
		call(Pred_44, K1_47, V1_48, A3_59, A4_60, DCG_3_66, DCG_4_67),
		tree234:foldl2(Pred_44, T2_53, A4_60, A5_61, DCG_4_67, DCG_5_68),
		call(Pred_44, K2_49, V2_50, A5_61, A6_62, DCG_5_68, DCG_6_69),
		tree234:foldl2(Pred_44, T3_54, A6_62, A_56, DCG_6_69, DCG_7_70).
tree234:map_values(_Pred_4, (tree234:empty), (tree234:empty)).
tree234:map_values(Pred_5, Tree0_6, Tree_7) :-
		Tree0_6 = tree234:two(K0_8, V0_9, Left0_10, Right0_11),
		Tree_7 = tree234:two(K0_8, W0_12, Left_13, Right_14),
		call(Pred_5, K0_8, V0_9, W0_12),
		tree234:map_values(Pred_5, Left0_10, Left_13),
		tree234:map_values(Pred_5, Right0_11, Right_14).
tree234:map_values(Pred_15, Tree0_16, Tree_17) :-
		Tree0_16 = tree234:three(K0_18, V0_19, K1_20, V1_21, Left0_22, Middle0_23, Right0_24),
		Tree_17 = tree234:three(K0_18, W0_25, K1_20, W1_26, Left_27, Middle_28, Right_29),
		call(Pred_15, K0_18, V0_19, W0_25),
		call(Pred_15, K1_20, V1_21, W1_26),
		tree234:map_values(Pred_15, Left0_22, Left_27),
		tree234:map_values(Pred_15, Middle0_23, Middle_28),
		tree234:map_values(Pred_15, Right0_24, Right_29).
tree234:map_values(Pred_30, Tree0_31, Tree_32) :-
		Tree0_31 = tree234:four(K0_33, V0_34, K1_35, V1_36, K2_37, V2_38, Left0_39, LMid0_40, RMid0_41, Right0_42),
		Tree_32 = tree234:four(K0_33, W0_43, K1_35, W1_44, K2_37, W2_45, Left_46, LMid_47, RMid_48, Right_49),
		call(Pred_30, K0_33, V0_34, W0_43),
		call(Pred_30, K1_35, V1_36, W1_44),
		call(Pred_30, K2_37, V2_38, W2_45),
		tree234:map_values(Pred_30, Left0_39, Left_46),
		tree234:map_values(Pred_30, LMid0_40, LMid_47),
		tree234:map_values(Pred_30, RMid0_41, RMid_48),
		tree234:map_values(Pred_30, Right0_42, Right_49).
tree234:map_values(F_4, T1_5) = T2_6 :-
		P_7 = (pred(V_13::(builtin:in), V_12::(builtin:in), V_11::(builtin:out)) is det :-
			some [] (
				V_13 = X_14,
				V_12 = Y_15,
				V_11 = Z_16,
				Z_16 = apply(F_4, X_14, Y_15)
			)
		),
		tree234:map_values(P_7, T1_5, T2_6).
tree234:map_foldl(_Pred_6, (tree234:empty), (tree234:empty), A_7, A_7).
tree234:map_foldl(Pred_8, Tree0_9, Tree_10, A0_11, A_12) :-
		Tree0_9 = tree234:two(K0_13, V0_14, Left0_15, Right0_16),
		Tree_10 = tree234:two(K0_13, W0_17, Left_18, Right_19),
		tree234:map_foldl(Pred_8, Left0_15, Left_18, A0_11, A1_20),
		call(Pred_8, K0_13, V0_14, W0_17, A1_20, A2_21),
		tree234:map_foldl(Pred_8, Right0_16, Right_19, A2_21, A_12).
tree234:map_foldl(Pred_22, Tree0_23, Tree_24, A0_25, A_26) :-
		Tree0_23 = tree234:three(K0_27, V0_28, K1_29, V1_30, Left0_31, Middle0_32, Right0_33),
		Tree_24 = tree234:three(K0_27, W0_34, K1_29, W1_35, Left_36, Middle_37, Right_38),
		tree234:map_foldl(Pred_22, Left0_31, Left_36, A0_25, A1_39),
		call(Pred_22, K0_27, V0_28, W0_34, A1_39, A2_40),
		tree234:map_foldl(Pred_22, Middle0_32, Middle_37, A2_40, A3_41),
		call(Pred_22, K1_29, V1_30, W1_35, A3_41, A4_42),
		tree234:map_foldl(Pred_22, Right0_33, Right_38, A4_42, A_26).
tree234:map_foldl(Pred_43, Tree0_44, Tree_45, A0_46, A_47) :-
		Tree0_44 = tree234:four(K0_48, V0_49, K1_50, V1_51, K2_52, V2_53, Left0_54, LMid0_55, RMid0_56, Right0_57),
		Tree_45 = tree234:four(K0_48, W0_58, K1_50, W1_59, K2_52, W2_60, Left_61, LMid_62, RMid_63, Right_64),
		tree234:map_foldl(Pred_43, Left0_54, Left_61, A0_46, A1_65),
		call(Pred_43, K0_48, V0_49, W0_58, A1_65, A2_66),
		tree234:map_foldl(Pred_43, LMid0_55, LMid_62, A2_66, A3_67),
		call(Pred_43, K1_50, V1_51, W1_59, A3_67, A4_68),
		tree234:map_foldl(Pred_43, RMid0_56, RMid_63, A4_68, A5_69),
		call(Pred_43, K2_52, V2_53, W2_60, A5_69, A6_70),
		tree234:map_foldl(Pred_43, Right0_57, Right_64, A6_70, A_47).
:- pragma termination_info(tree234:init((builtin:uo)), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info((tree234:init) = (builtin:out), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info(tree234:is_empty((builtin:in)), finite(0, [no, no, no]), cannot_loop).
:- pragma termination_info(tree234:member((builtin:in), (builtin:out), (builtin:out)), finite(-4, [no, no, yes, no, no]), cannot_loop).
:- pragma termination_info(tree234:search((builtin:in), (builtin:in), (builtin:out)), finite(-4, [no, no, yes, no, no]), cannot_loop).
:- pragma termination_info(tree234:lookup((builtin:in), (builtin:in), (builtin:out)), finite(-4, [no, no, yes, no, no]), can_loop).
:- pragma termination_info(tree234:lookup((builtin:in), (builtin:in)) = (builtin:out), finite(-4, [no, no, yes, no, no]), can_loop).
:- pragma termination_info(tree234:lower_bound_search((builtin:in), (builtin:in), (builtin:out), (builtin:out)), finite(-4, [no, no, yes, yes, no, no]), cannot_loop).
:- pragma termination_info(tree234:lower_bound_lookup((builtin:in), (builtin:in), (builtin:out), (builtin:out)), finite(-4, [no, no, yes, yes, no, no]), can_loop).
:- pragma termination_info(tree234:upper_bound_search((builtin:in), (builtin:in), (builtin:out), (builtin:out)), finite(-4, [no, no, yes, yes, no, no]), cannot_loop).
:- pragma termination_info(tree234:upper_bound_lookup((builtin:in), (builtin:in), (builtin:out), (builtin:out)), finite(-4, [no, no, yes, yes, no, no]), can_loop).
:- pragma termination_info(tree234:insert((builtin:in), (builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(tree234:set((builtin:di), (builtin:di), (builtin:di), (builtin:uo)), infinite, cannot_loop).
:- pragma termination_info(tree234:set((builtin:in), (builtin:in), (builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(tree234:set((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(tree234:delete((builtin:di), (builtin:in), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:delete((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:delete((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(tree234:remove((builtin:di), (builtin:in), (builtin:uo), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:remove((builtin:in), (builtin:in), (builtin:out), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:remove_smallest((builtin:di), (builtin:uo), (builtin:uo), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:remove_smallest((builtin:in), (builtin:out), (builtin:out), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:keys((builtin:in), (builtin:out)), finite(0, [no, no, yes, no]), cannot_loop).
:- pragma termination_info(tree234:keys((builtin:in)) = (builtin:out), finite(0, [no, no, yes, no]), cannot_loop).
:- pragma termination_info(tree234:values((builtin:in), (builtin:out)), finite(0, [no, no, yes, no]), cannot_loop).
:- pragma termination_info(tree234:values((builtin:in)) = (builtin:out), finite(0, [no, no, yes, no]), cannot_loop).
:- pragma termination_info(tree234:update((builtin:in), (builtin:in), (builtin:in), (builtin:out)), finite(0, [no, no, yes, no, yes, no]), cannot_loop).
:- pragma termination_info(tree234:count((builtin:in), (builtin:out)), finite(0, [no, no, no, no]), cannot_loop).
:- pragma termination_info(tree234:count((builtin:in)) = (builtin:out), finite(0, [no, no, no, no]), cannot_loop).
:- pragma termination_info(tree234:assoc_list_to_tree234((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:assoc_list_to_tree234((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(tree234:tree234_to_assoc_list((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:tree234_to_assoc_list((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(tree234:foldl((pred((builtin:in), (builtin:in), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:foldl((pred((builtin:in), (builtin:in), (builtin:in), (builtin:out)) is semidet), (builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:foldl((pred((builtin:in), (builtin:in), (builtin:di), (builtin:uo)) is det), (builtin:in), (builtin:di), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:foldl((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(tree234:foldl2((pred((builtin:in), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:foldl2((pred((builtin:in), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)) is semidet), (builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:foldl2((pred((builtin:in), (builtin:in), (builtin:in), (builtin:out), (builtin:di), (builtin:uo)) is det), (builtin:in), (builtin:in), (builtin:out), (builtin:di), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:foldl2((pred((builtin:in), (builtin:in), (builtin:di), (builtin:uo), (builtin:di), (builtin:uo)) is det), (builtin:in), (builtin:di), (builtin:uo), (builtin:di), (builtin:uo)), infinite, can_loop).
:- pragma termination_info(tree234:map_values((pred((builtin:in), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:map_values((pred((builtin:in), (builtin:in), (builtin:out)) is semidet), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:map_values((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(tree234:map_foldl((pred((builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)) is det), (builtin:in), (builtin:out), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(tree234:map_foldl((pred((builtin:in), (builtin:in), (builtin:out), (builtin:in), (builtin:out)) is semidet), (builtin:in), (builtin:out), (builtin:in), (builtin:out)), infinite, can_loop).
