:- module queue. :- use_module builtin, int, list, private_builtin, std_util. :- type (queue:queue(T)) == (std_util:pair((list:list(T)), (list:list(T)))). queue:init((std_util:(V_2 - V_3))) :- V_2 = list:[], V_3 = list:[]. queue:init = Q_2 :- queue:init(Q_2). queue:is_empty((std_util:(V_2 - V_3))) :- V_3 = list:[]. queue:is_full(V_2) :- std_util:semidet_fail. queue:put(Q1_4, T_5) = Q2_6 :- queue:put(Q1_4, T_5, Q2_6). queue:put_list(Q1_4, Xs_5) = Q2_6 :- queue:put_list(Q1_4, Xs_5, Q2_6). queue:first((std_util:(V_3 - V_6)), Elem_4) :- V_6 = list:[Elem_4 | V_5]. queue:length((std_util:(On_3 - Off_4)), Length_5) :- list:length(On_3, LengthOn_6), list:length(Off_4, LengthOff_7), Length_5 = int:(LengthOn_6 + LengthOff_7). queue:length(Q_3) = N_4 :- queue:length(Q_3, N_4). queue:list_to_queue(List_3, (std_util:(V_4 - List_3))) :- V_4 = list:[]. queue:list_to_queue(Xs_3) = Q_4 :- queue:list_to_queue(Xs_3, Q_4). queue:delete_all(Q1_4, T_5) = Q2_6 :- queue:delete_all(Q1_4, T_5, Q2_6). :- pragma termination_info(queue:init((builtin:out)), finite(2, [no, no]), cannot_loop). :- pragma termination_info((queue:init) = (builtin:out), finite(2, [no, no]), cannot_loop). :- pragma termination_info(queue:equal((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop). :- pragma termination_info(queue:is_empty((builtin:in)), finite(0, [no, no]), cannot_loop). :- pragma termination_info(queue:is_full((builtin:in)), finite(0, [no, no]), can_loop). :- pragma termination_info(queue:put((builtin:in), (builtin:in), (builtin:out)), finite(2, [no, yes, yes, no]), cannot_loop). :- pragma termination_info(queue:put((builtin:in), (builtin:in)) = (builtin:out), finite(2, [no, yes, yes, no]), cannot_loop). :- pragma termination_info(queue:put_list((builtin:in), (builtin:in), (builtin:out)), finite(0, [no, yes, yes, no]), can_loop). :- pragma termination_info(queue:put_list((builtin:in), (builtin:in)) = (builtin:out), finite(0, [no, yes, yes, no]), can_loop). :- pragma termination_info(queue:first((builtin:in), (builtin:out)), finite(-4, [no, yes, no]), cannot_loop). :- pragma termination_info(queue:get((builtin:in), (builtin:out), (builtin:out)), infinite, can_loop). :- pragma termination_info(queue:length((builtin:in), (builtin:out)), finite(0, [no, no, no]), can_loop). :- pragma termination_info(queue:length((builtin:in)) = (builtin:out), finite(0, [no, no, no]), can_loop). :- pragma termination_info(queue:list_to_queue((builtin:in), (builtin:out)), finite(2, [no, yes, no]), cannot_loop). :- pragma termination_info(queue:list_to_queue((builtin:in)) = (builtin:out), finite(2, [no, yes, no]), cannot_loop). :- pragma termination_info(queue:delete_all((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop). :- pragma termination_info(queue:delete_all((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).