
msg(?X, ?Y, -MSG)

   MSG is the most specific generalisation of X and Y representable with ic-symbolic domain variables

Arguments
   X                   Any term or variable
   Y                   Any term or variable
   MSG                 A domain variable or constant (output)

Type
   library(ic_symbolic)

Description

	This predicate computes the most specific generalisation of X and Y
	which can be represented using ic-symbolic's domains and domain
	variables.
	
	If X and Y are domain variables (or constants) from the same domain,
	then MSG will be unified with a new domain variable whose domain
	consists of the union of the domain elements of X and Y.
	
	If X and Y are domain variables or constants with incompatible
	domains, then the result will be a free (unconstrained) variable.
	
	If X or Y are free (unconstrained) variables, then the result will
	also be a free (unconstrained) variable.
    

Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Fail Conditions
   None

Examples
   
    ?- local domain(weekday(mo, tu, we, th, fr, sa, su)).
    Yes (0.00s cpu)

    ?- msg(we, fr, Z).
    Z = Z{[we, fr]}
    Yes (0.00s cpu)

    ?- X &:: [sa, su], msg(X, we, Z).
    X = X{[sa, su]}
    Z = Z{[we, sa, su]}
    Yes (0.00s cpu)

    ?- X &:: [sa, su], Y &:: [mo, tu, we], msg(X, Y, Z).
    X = X{[sa, su]}
    Y = Y{[mo, tu, we]}
    Z = Z{[mo, tu, we, sa, su]}
    Yes (0.00s cpu)

    ?- X &:: [sa, su], msg(X, _, Z).
    X = X{[sa, su]}
    Z = Z
    Yes (0.01s cpu)

    % in the following, the result is not precisely representable
    ?- X &:: [sa, su], msg(X, foo, Z).
    X = X{[sa, su]}
    Z = Z
    Yes (0.01s cpu)
    

See Also
   fd_sets : msg / 3, gfd : msg / 3, ic_kernel : msg / 3, ic_sets : msg / 3, sd : msg / 3, fd : msg / 3, library(propia), &:: / 2, domain / 1
