:- module array. :- use_module builtin, exception, int, list, private_builtin, random, require, std_util, string. :- type (array:array(T)). :- pragma foreign_import_module("C", array). :- pred array:equal_elements(int, int, (array:array(T_1)), (array:array(T_1))). :- mode array:equal_elements((builtin:in), (builtin:in), (builtin:in), (builtin:in)) is semidet. :- pred array:bsearch_2((array:array(T_1)), int, int, T_1, pred(T_1, T_1, (builtin:comparison_result)), (std_util:maybe(int))). :- mode array:bsearch_2((builtin:in), (builtin:in), (builtin:in), (builtin:in), (pred((builtin:in), (builtin:in), (builtin:out)) is det), (builtin:out)) is det. :- pred array:map_2(int, int, pred(T1_1, T2_2), (array:array(T1_1)), (array:array(T2_2)), (array:array(T2_2))). :- mode array:map_2((builtin:in), (builtin:in), (pred((builtin:in), (builtin:out)) is det), (builtin:in), (array:array_di), (array:array_uo)) is det. :- func array:foldl_0((func(T1_1, T2_2) = T2_2), (array:array(T1_1)), T2_2, int, int) = T2_2. :- mode array:foldl_0((func((builtin:in), (builtin:in)) = (builtin:out) is det), (array:array_ui), (builtin:in), (builtin:in), (builtin:in)) = (builtin:out) is det. :- mode array:foldl_0((func((builtin:in), (builtin:in)) = (builtin:out) is det), (builtin:in), (builtin:in), (builtin:in), (builtin:in)) = (builtin:out) is det. :- mode array:foldl_0((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (array:array_ui), (builtin:di), (builtin:in), (builtin:in)) = (builtin:uo) is det. :- mode array:foldl_0((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (builtin:in), (builtin:di), (builtin:in), (builtin:in)) = (builtin:uo) is det. :- func array:foldr_0((func(T1_1, T2_2) = T2_2), (array:array(T1_1)), T2_2, int, int) = T2_2. :- mode array:foldr_0((func((builtin:in), (builtin:in)) = (builtin:out) is det), (array:array_ui), (builtin:in), (builtin:in), (builtin:in)) = (builtin:out) is det. :- mode array:foldr_0((func((builtin:in), (builtin:in)) = (builtin:out) is det), (builtin:in), (builtin:in), (builtin:in), (builtin:in)) = (builtin:out) is det. :- mode array:foldr_0((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (array:array_ui), (builtin:di), (builtin:in), (builtin:in)) = (builtin:uo) is det. :- mode array:foldr_0((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (builtin:in), (builtin:di), (builtin:in), (builtin:in)) = (builtin:uo) is det. :- func array:samsort_subarray((array:array(T_1)), int, int) = (array:array(T_1)). :- mode array:samsort_subarray((array:array_di), (builtin:in), (builtin:in)) = (array:array_uo) is det. :- pragma type_spec((array:samsort_subarray)/3, (T_1 = string), (array:'TypeSpecOf__pred_or_func__samsort_subarray__[T = string]')). :- pragma type_spec((array:samsort_subarray)/3, (T_1 = int), (array:'TypeSpecOf__pred_or_func__samsort_subarray__[T = int]')). :- pred array:samsort_up(int, (array:array(T_1)), (array:array(T_1)), (array:array(T_1)), (array:array(T_1)), int, int, int). :- mode array:samsort_up((builtin:in), (array:array_di), (array:array_uo), (array:array_di), (array:array_uo), (builtin:in), (builtin:in), (builtin:in)) is det. :- pragma type_spec((array:samsort_up)/8, (T_1 = string), (array:'TypeSpecOf__pred_or_func__samsort_up__[T = string]')). :- pragma type_spec((array:samsort_up)/8, (T_1 = int), (array:'TypeSpecOf__pred_or_func__samsort_up__[T = int]')). :- pragma foreign_proc("C", array:make_empty_array(Array :: (array:array_uo)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " MR_incr_hp_msg(Array, 1, MR_PROC_LABEL, \"array:array/1\"); ML_init_array((MR_ArrayType *)Array, 0, 0); "). array:make_empty_array = A_2 :- array:make_empty_array(A_2). array:init(N_4, X_5) = A_6 :- array:init(N_4, X_5, A_6). array:array(List_3) = Array_4 :- array:from_list(List_3, Array_4). :- pragma promise_pure((array:min)/2). :- pragma foreign_proc("C", array:min(Array :: (builtin:in), Min :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " /* Array not used */ Min = 0; "). :- pragma foreign_proc("C", array:min(Array :: (array:array_ui), Min :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " /* Array not used */ Min = 0; "). array:min(A_3) = N_4 :- array:min(A_3, N_4). :- pragma promise_pure((array:max)/2). :- pragma foreign_proc("C", array:max(Array :: (builtin:in), Max :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " Max = ((MR_ArrayType *)Array)->size - 1; "). :- pragma foreign_proc("C", array:max(Array :: (array:array_ui), Max :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " Max = ((MR_ArrayType *)Array)->size - 1; "). array:max(A_3) = N_4 :- array:max(A_3, N_4). :- pragma promise_pure((array:size)/2). :- pragma foreign_proc("C", array:size(Array :: (builtin:in), Max :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " Max = ((MR_ArrayType *)Array)->size; "). :- pragma foreign_proc("C", array:size(Array :: (array:array_ui), Max :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " Max = ((MR_ArrayType *)Array)->size; "). array:size(A_3) = N_4 :- array:size(A_3, N_4). array:bounds(Array_4, Min_5, Max_6) :- array:min(Array_4, Min_5), array:max(Array_4, Max_6). array:in_bounds(Array_3, Index_4) :- array:bounds(Array_3, Min_5, Max_6), int:(Min_5 =< Index_4), int:(Index_4 =< Max_6). array:lookup(A_4, N_5) = X_6 :- array:lookup(A_4, N_5, X_6). array:semidet_lookup(Array_4, Index_5, Item_6) :- array:in_bounds(Array_4, Index_5), array:lookup(Array_4, Index_5, Item_6). array:set(A1_5, N_6, X_7) = A2_8 :- array:set(A1_5, N_6, X_7, A2_8). array:semidet_set(Array0_5, Index_6, Item_7, Array_8) :- array:in_bounds(Array0_5, Index_6), array:set(Array0_5, Index_6, Item_7, Array_8). array:slow_set(Array0_5, Index_6, Item_7, Array_8) :- array:copy(Array0_5, Array1_9), array:set(Array1_9, Index_6, Item_7, Array_8). array:slow_set(A1_5, N_6, X_7) = A2_8 :- array:slow_set(A1_5, N_6, X_7, A2_8). array:semidet_slow_set(Array0_5, Index_6, Item_7, Array_8) :- array:in_bounds(Array0_5, Index_6), array:slow_set(Array0_5, Index_6, Item_7, Array_8). array:elem(Index_4, Array_5) = HeadVar__3_3 :- HeadVar__3_3 = array:lookup(Array_5, Index_4). array:'elem :='(Index_5, Array_6, Value_7) = HeadVar__4_4 :- HeadVar__4_4 = array:set(Array_6, Index_5, Value_7). :- pragma promise_pure((array:copy)/2). :- pragma foreign_proc("C", array:copy(Array0 :: (builtin:in), Array :: (array:array_uo)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " MR_incr_hp_msg(Array, (((const MR_ArrayType *) Array0)->size) + 1, MR_PROC_LABEL, \"array:array/1\"); ML_copy_array((MR_ArrayType *)Array, (const MR_ArrayType *) Array0); "). :- pragma foreign_proc("C", array:copy(Array0 :: (array:array_ui), Array :: (array:array_uo)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " MR_incr_hp_msg(Array, (((const MR_ArrayType *) Array0)->size) + 1, MR_PROC_LABEL, \"array:array/1\"); ML_copy_array((MR_ArrayType *)Array, (const MR_ArrayType *) Array0); "). array:copy(A1_3) = A2_4 :- array:copy(A1_3, A2_4). :- pragma foreign_proc("C", array:resize(Array0 :: (array:array_di), Size :: (builtin:in), Item :: (builtin:in), Array :: (array:array_uo)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], " if (((MR_ArrayType *)Array0)->size == Size) { Array = Array0; } else { MR_incr_hp_msg(Array, Size + 1, MR_PROC_LABEL, \"array:array/1\"); ML_resize_array((MR_ArrayType *) Array, (MR_ArrayType *) Array0, Size, Item); } "). array:resize(A1_5, N_6, X_7) = A2_8 :- array:resize(A1_5, N_6, X_7, A2_8). array:shrink(A1_4, N_5) = A2_6 :- array:shrink(A1_4, N_5, A2_6). array:from_list(Xs_3) = A_4 :- array:from_list(Xs_3, A_4). array:to_list(Array_3, List_4) :- array:bounds(Array_3, Low_5, High_6), array:fetch_items(Array_3, Low_5, High_6, List_4). array:to_list(A_3) = Xs_4 :- array:to_list(A_3, Xs_4). array:fetch_items(Array_5, Low_6, High_7, List_8) :- List_8 = array:foldr_0(V_11, Array_5, V_12, Low_6, High_7), V_11 = (func(V_15::(builtin:in), V_14::(builtin:in)) = (V_13::(builtin:out)) is det :- some [] ( V_15 = X_16, V_14 = Xs_17, V_13 = list:[X_16 | Xs_17] ) ), V_12 = list:[]. array:fetch_items(A_5, N1_6, N2_7) = Xs_8 :- array:fetch_items(A_5, N1_6, N2_7, Xs_8). array:bsearch(A_5, El_6, Compare_7, Result_8) :- array:bounds(A_5, Lo_9, Hi_10), array:bsearch_2(A_5, Lo_9, Hi_10, El_6, Compare_7, Result_8). array:bsearch(A_5, X_6, F_7) = MN_8 :- P_9 = (pred(V_15::(builtin:in), V_14::(builtin:in), V_13::(builtin:out)) is det :- some [] ( V_15 = X1_16, V_14 = X2_17, V_13 = C_18, C_18 = apply(F_7, X1_16, X2_17) ) ), array:bsearch(A_5, X_6, P_9, MN_8). array:map(Closure_4, OldArray_5, NewArray_6) :- (if V_11 = 0, array:semidet_lookup(OldArray_5, V_11, Elem0_7) then array:size(OldArray_5, Size_8), call(Closure_4, Elem0_7, Elem_9), array:init(Size_8, Elem_9, NewArray0_10), V_12 = 1, array:map_2(V_12, Size_8, Closure_4, OldArray_5, NewArray0_10, NewArray_6) else array:make_empty_array(NewArray_6) ). array:map(F_4, A1_5) = A2_6 :- P_7 = (pred(V_11::(builtin:in), V_10::(builtin:out)) is det :- some [] ( V_11 = X_12, V_10 = Y_13, Y_13 = apply(F_4, X_12) ) ), array:map(P_7, A1_5, A2_6). array:array_compare(A1_4, A2_5) = C_6 :- array:array_compare(C_6, A1_4, A2_5). array:sort(A_3) = HeadVar__2_2 :- HeadVar__2_2 = array:samsort_subarray(A_3, V_4, V_5), V_4 = array:min(A_3), V_5 = array:max(A_3). array:foldl(Fn_5, A_6, X_7) = HeadVar__4_4 :- HeadVar__4_4 = array:foldl_0(Fn_5, A_6, X_7, V_8, V_9), V_8 = array:min(A_6), V_9 = array:max(A_6). array:foldr(Fn_5, A_6, X_7) = HeadVar__4_4 :- HeadVar__4_4 = array:foldr_0(Fn_5, A_6, X_7, V_8, V_9), V_8 = array:min(A_6), V_9 = array:max(A_6). array:array_equal(Array1_3, Array2_4) :- array:size(Array1_3, Size_5), array:size(Array2_4, Size_5), V_6 = 0, array:equal_elements(V_6, Size_5, Array1_3, Array2_4). array:bsearch_2(Array_7, Lo_8, Hi_9, El_10, Compare_11, Result_12) :- Width_13 = int:(Hi_9 - Lo_8), (if V_19 = 0, int:(Width_13 < V_19) then Result_12 = std_util:no else (if Width_13 = 0 then array:lookup(Array_7, Lo_8, X_14), (if V_20 = builtin:(=), call(Compare_11, El_10, X_14, V_20) then Result_12 = std_util:yes(Lo_8) else Result_12 = std_util:no ) else Mid_15 = int:(V_21 >> V_22), V_21 = int:(Lo_8 + Hi_9), V_22 = 1, array:lookup(Array_7, Mid_15, XMid_16), call(Compare_11, XMid_16, El_10, Comp_17), ( % disjunction Comp_17 = builtin:(<), Mid1_18 = int:(Mid_15 + V_24), V_24 = 1, array:bsearch_2(Array_7, Mid1_18, Hi_9, El_10, Compare_11, Result_12) ; Comp_17 = builtin:(=), array:bsearch_2(Array_7, Lo_8, Mid_15, El_10, Compare_11, Result_12) ; Comp_17 = builtin:(>), Mid1_25 = int:(Mid_15 - V_23), V_23 = 1, array:bsearch_2(Array_7, Lo_8, Mid1_25, El_10, Compare_11, Result_12) ) ) ). array:map_2(N_7, Size_8, Closure_9, OldArray_10, NewArray0_11, NewArray_12) :- (if int:(N_7 >= Size_8) then NewArray_12 = NewArray0_11 else array:lookup(OldArray_10, N_7, OldElem_13), call(Closure_9, OldElem_13, NewElem_14), array:set(NewArray0_11, N_7, NewElem_14, NewArray1_15), V_16 = int:(N_7 + V_17), V_17 = 1, array:map_2(V_16, Size_8, Closure_9, OldArray_10, NewArray1_15, NewArray_12) ). array:foldl_0(Fn_7, A_8, X_9, I_10, Max_11) = HeadVar__6_6 :- (if int:(Max_11 < I_10) then HeadVar__6_6 = X_9 else HeadVar__6_6 = array:foldl_0(Fn_7, A_8, V_12, V_13, Max_11), V_12 = apply(Fn_7, V_14, X_9), V_14 = array:elem(I_10, A_8), V_13 = int:(I_10 + V_15), V_15 = 1 ). array:foldr_0(Fn_7, A_8, X_9, Min_10, I_11) = HeadVar__6_6 :- (if int:(I_11 < Min_10) then HeadVar__6_6 = X_9 else HeadVar__6_6 = array:foldr_0(Fn_7, A_8, V_12, Min_10, V_13), V_12 = apply(Fn_7, V_14, X_9), V_14 = array:elem(I_11, A_8), V_13 = int:(I_11 - V_15), V_15 = 1 ). array:samsort_subarray(A0_5, Lo_6, Hi_7) = A_8 :- V_10 = 0, V_11 = array:copy(A0_5), V_12 = Lo_6, array:samsort_up(V_10, A0_5, V_9, V_11, A_8, Lo_6, Hi_7, V_12). :- pragma termination_info(array:make_empty_array((array:array_uo)), infinite, cannot_loop). :- pragma termination_info((array:make_empty_array) = (array:array_uo), infinite, cannot_loop). :- pragma termination_info(array:init((builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:init((builtin:in), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:array((builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:min((array:array_ui), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:min((builtin:in), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:min((array:array_ui)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:min((builtin:in)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:max((array:array_ui), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:max((builtin:in), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:max((array:array_ui)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:max((builtin:in)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:size((array:array_ui), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:size((builtin:in), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:size((array:array_ui)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:size((builtin:in)) = (builtin:out), infinite, cannot_loop). :- pragma termination_info(array:bounds((array:array_ui), (builtin:out), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:bounds((builtin:in), (builtin:out), (builtin:out)), infinite, cannot_loop). :- pragma termination_info(array:in_bounds((array:array_ui), (builtin:in)), finite(0, [no, no, no]), cannot_loop). :- pragma termination_info(array:in_bounds((builtin:in), (builtin:in)), finite(0, [no, no, no]), cannot_loop). :- pragma termination_info(array:lookup((array:array_ui), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:lookup((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:lookup((array:array_ui), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:lookup((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:semidet_lookup((array:array_ui), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:semidet_lookup((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:set((array:array_di), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:set((array:array_di), (builtin:in), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:semidet_set((array:array_di), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:slow_set((array:array_ui), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:slow_set((builtin:in), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:slow_set((array:array_ui), (builtin:in), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:slow_set((builtin:in), (builtin:in), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:semidet_slow_set((array:array_ui), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:semidet_slow_set((builtin:in), (builtin:in), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:elem((builtin:in), (array:array_ui)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:elem((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:'elem :='((builtin:in), (array:array_di), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:copy((array:array_ui), (array:array_uo)), infinite, cannot_loop). :- pragma termination_info(array:copy((builtin:in), (array:array_uo)), infinite, cannot_loop). :- pragma termination_info(array:copy((array:array_ui)) = (array:array_uo), infinite, cannot_loop). :- pragma termination_info(array:copy((builtin:in)) = (array:array_uo), infinite, cannot_loop). :- pragma termination_info(array:resize((array:array_di), (builtin:in), (builtin:in), (array:array_uo)), infinite, cannot_loop). :- pragma termination_info(array:resize((array:array_di), (builtin:in), (builtin:in)) = (array:array_uo), infinite, cannot_loop). :- pragma termination_info(array:shrink((array:array_di), (builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:shrink((array:array_di), (builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:from_list((builtin:in), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:from_list((builtin:in)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:to_list((array:array_ui), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:to_list((builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:to_list((array:array_ui)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:to_list((builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:fetch_items((builtin:in), (builtin:in), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:fetch_items((array:array_ui), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:fetch_items((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:bsearch((array:array_ui), (builtin:in), builtin:in((builtin:comparison_pred)), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:bsearch((builtin:in), (builtin:in), builtin:in((builtin:comparison_pred)), (builtin:out)), infinite, can_loop). :- pragma termination_info(array:bsearch((array:array_ui), (builtin:in), builtin:in((builtin:comparison_func))) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:bsearch((builtin:in), (builtin:in), builtin:in((builtin:comparison_func))) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:map((pred((builtin:in), (builtin:out)) is det), (array:array_di), (array:array_uo)), infinite, can_loop). :- pragma termination_info(array:map((func((builtin:in)) = (builtin:out) is det), (array:array_di)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:array_compare((builtin:in), (builtin:in)) = (builtin:out), finite(0, [no, no, no, no]), can_loop). :- pragma termination_info(array:sort((array:array_di)) = (array:array_uo), infinite, can_loop). :- pragma termination_info(array:foldl((func((builtin:in), (builtin:in)) = (builtin:out) is det), (array:array_ui), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:foldl((func((builtin:in), (builtin:in)) = (builtin:out) is det), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:foldl((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (array:array_ui), (builtin:di)) = (builtin:uo), infinite, can_loop). :- pragma termination_info(array:foldl((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (builtin:in), (builtin:di)) = (builtin:uo), infinite, can_loop). :- pragma termination_info(array:foldr((func((builtin:in), (builtin:in)) = (builtin:out) is det), (array:array_ui), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:foldr((func((builtin:in), (builtin:in)) = (builtin:out) is det), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(array:foldr((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (array:array_ui), (builtin:di)) = (builtin:uo), infinite, can_loop). :- pragma termination_info(array:foldr((func((builtin:in), (builtin:di)) = (builtin:uo) is det), (builtin:in), (builtin:di)) = (builtin:uo), infinite, can_loop). :- pragma termination_info(array:random_permutation((array:array_di), (array:array_uo), (builtin:mdi), (builtin:muo)), infinite, can_loop). :- pragma termination_info(array:array_equal((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop). :- pragma termination_info(array:array_compare((builtin:out), (builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).