[mercury-users] Type inference

Jakob Puchinger jakobp at csse.unimelb.edu.au
Tue Jan 15 11:47:48 AEDT 2008


I have a strange problem with type inference, the following predicate:

create_empty_colgen_dw_solver(ColgenSolver, MasterSolver, ArtMult) :-
    semipure get_solver_id(SID),
    impure set_solver_id(SID+1),
    impure SPSolvers = ref.new(array([])),
    impure Sense = ref.new(minimise),
    impure VarId = ref.new(0),
    impure VarKJMap = ref.new(map.init),
    impure ArtVars = ref.new([]),
    impure S = ref.new(0),
    impure N0 = ref.new(0),
    impure N = ref.new(array([])),
    impure K = ref.new(array([])),
    impure A = ref.new(array([])),
    impure AR = ref.new(array([])),
    impure OV0 = ref.new(array([])),
    impure C0 = ref.new(array([])),
    impure C = ref.new(array([])),
    impure D = ref.new(map.init),
    impure DR = ref.new(map.init),
    impure Sol = ref.new(array([])),
    impure CM = ref.new(map.init),
    impure RCM = ref.new(map.init),
    impure ConvRows = ref.new(map.init),
    impure ActiveSP = ref.new(map.init),
    impure Status = ref.new(is_not_solved),
    ColgenSolver = 'new colgen_dw_solver'(SID, MasterSolver, ArtMult, Status,
        SPSolvers, Sense, VarId, VarKJMap, ArtVars, S, N0, N, K, A, AR, OV0,
        C0, C, D, DR, CM, RCM, ConvRows, ActiveSP, Sol).

gives the following error message:
colgen_dw_new.m:894: In clause for predicate `create_empty_colgen_dw_solver'/3:
colgen_dw_new.m:894:   warning: highly ambiguous overloading.
colgen_dw_new.m:894:   This may cause type-checking to be very slow. It may
colgen_dw_new.m:894:   also make your code difficult to understand.
colgen_dw_new.m:894:   The following symbols were overloaded in the following
colgen_dw_new.m:894:   contexts.
colgen_dw_new.m:859:   The predicate symbol predicate `=<'/2.
colgen_dw_new.m:859:   The possible matches are:
colgen_dw_new.m:859:     predicate `int.=<'/2,
colgen_dw_new.m:859:     predicate `float.=<'/2.
colgen_dw_new.m:868:   The function symbol `+'/2.
colgen_dw_new.m:868:   The possible matches are:
colgen_dw_new.m:868:     function `float.+'/2,
colgen_dw_new.m:868:     function `int.+'/2.
colgen_dw_new.m:877:   The function symbol `map.init'/0.
colgen_dw_new.m:877:   The possible matches are:
colgen_dw_new.m:877:     predicate `map.init'/1,
colgen_dw_new.m:877:     function `map.init'/0.
colgen_dw_new.m:888:   The function symbol `map.init'/0 is also overloaded
colgen_dw_new.m:888:   here.
colgen_dw_new.m:889:   The function symbol `map.init'/0 is also overloaded
colgen_dw_new.m:889:   here.
colgen_dw_new.m:891:   The function symbol `map.init'/0 is also overloaded
colgen_dw_new.m:891:   here.
colgen_dw_new.m:892:   The function symbol `map.init'/0 is also overloaded
colgen_dw_new.m:892:   here.
colgen_dw_new.m:894:   The function symbol `map.init'/0 is also overloaded
colgen_dw_new.m:894:   here.
** Error making

which can be resolved by adding type specifications on two of the maps:
    impure ConvRows = ref.new(map.init : map(sp_id, int)),
    impure ActiveSP = ref.new(map.init : map(sp_id, set(sp_id))),

Why do I need to specify the type sometimes and sometimes type
inference works fine?

mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au

More information about the users mailing list