:- module bimap.
:- use_module assoc_list, builtin, list, map, private_builtin.
bimap:init(B_2) :-
		map:init(O_3),
		map:init(C_4),
		B_2 = bimap:bimap(O_3, C_4).
bimap:init = BM_2 :-
		bimap:init(BM_2).
bimap:is_empty((bimap:bimap(O_2, _C_3))) :-
		map:is_empty(O_2).
bimap:search((bimap:bimap(O_4, C_5)), K_6, V_7) :-
		map:search(O_4, K_6, V_7),
		map:search(C_5, V_7, K_6).
bimap:set(BM1_5, K_6, V_7) = BM2_8 :-
		bimap:set(BM1_5, K_6, V_7, BM2_8).
bimap:lookup((bimap:bimap(O_4, _C_5)), K_6, V_7) :-
		map:lookup(O_4, K_6, V_7).
bimap:lookup(BM_4, K_5) = V_6 :-
		bimap:lookup(BM_4, K_5, V_6).
bimap:reverse_lookup((bimap:bimap(_O_4, C_5)), K_6, V_7) :-
		map:lookup(C_5, V_7, K_6).
bimap:insert((bimap:bimap(O0_5, C0_6)), K_7, V_8, (bimap:bimap(O_9, C_10))) :-
		map:insert(O0_5, K_7, V_8, O_9),
		map:insert(C0_6, V_8, K_7, C_10).
bimap:set((bimap:bimap(O0_5, C0_6)), K_7, V_8, (bimap:bimap(O_9, C_10))) :-
		map:set(O0_5, K_7, V_8, O_9),
		map:set(C0_6, V_8, K_7, C_10).
bimap:ordinates((bimap:bimap(O_3, _C_4)), Os_5) :-
		map:keys(O_3, Os_5).
bimap:ordinates(BM_3) = Ks_4 :-
		bimap:ordinates(BM_3, Ks_4).
bimap:coordinates((bimap:bimap(_O_3, C_4)), Cs_5) :-
		map:keys(C_4, Cs_5).
bimap:coordinates(BM_3) = Vs_4 :-
		bimap:coordinates(BM_3, Vs_4).
bimap:to_assoc_list((bimap:bimap(O_3, _C_4)), L_5) :-
		map:to_assoc_list(O_3, L_5).
bimap:to_assoc_list(BM_3) = AL_4 :-
		bimap:to_assoc_list(BM_3, AL_4).
bimap:from_assoc_list(L_3, (bimap:bimap(O_4, C_5))) :-
		map:from_assoc_list(L_3, O_4),
		assoc_list:reverse_members(L_3, L1_6),
		map:from_assoc_list(L1_6, C_5).
bimap:from_assoc_list(AL_3) = BM_4 :-
		bimap:from_assoc_list(AL_3, BM_4).
:- pragma termination_info(bimap:init((builtin:out)), infinite, can_loop).
:- pragma termination_info((bimap:init) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:is_empty((builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(bimap:search((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:search((builtin:in), (builtin:out), (builtin:in)), infinite, can_loop).
:- pragma termination_info(bimap:set((builtin:in), (builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:lookup((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:lookup((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:reverse_lookup((builtin:in), (builtin:out), (builtin:in)), infinite, can_loop).
:- pragma termination_info(bimap:insert((builtin:in), (builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:set((builtin:in), (builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:ordinates((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:ordinates((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:coordinates((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:coordinates((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:to_assoc_list((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:to_assoc_list((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(bimap:from_assoc_list((builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(bimap:from_assoc_list((builtin:in)) = (builtin:out), infinite, can_loop).
