La definizione di "compatible" data in "Metamodelling a formal method : applying MDE to abstract state machines" (Table 3. pag 10) (http://www.crema.unimi.it/Biblioteca/SchedaNota.asp?Nota=119) viene usata dal parser per decidere se il dominio di un argomento di una macro call rule è compatibile con il dominio dell'argomento della definizione della macro rule.
Nella definizione di "compatible" si dice che, oltre ad altre condizioni, due domini "self" e "d" sono compatibili se
"self == d or
-- one is a ConcreteDomain and the other is its type-domain
( self.oclIsTypeOf(ConcreteDomain) and d.oclIsTypeOf(TypeDomain) and d = self.oclAsType(ConcreteDomain).typeDomain ) or
( d.oclIsTypeOf(ConcreteDomain) and self.oclIsTypeOf(TypeDomain) and self = d.oclAsType(ConcreteDomain).typeDomain )"
Il modello "wrongDomainAsActualParameter", quindi, viene parsato correttamente perché "Chan" e "ChanInt" sono compatibili.
------------------------------------------------------------
asm wrongDomainAsActualParameter
import ../../STDL/StandardLibrary
signature:
abstract domain Chan
domain ChanInt subsetof Chan
controlled f: Integer
controlled c: Chan
definitions:
macro rule r_m1($x in ChanInt) =
f := 1
main rule r_main=
r_m1[c]
default init s0:
function f = 3
------------------------------------------------------------
In esecuzione, però, il modello "wrongDomainAsActualParameter" deve sollevare un'eccezione: quando viene eseguita la macro call rule il dominio effettivo di "c" è ancora "Chan" e non "ChanInt". Per questo è stato introdotto in "RuleEvaluator" il metodo "compatible" per cui, oltre ad altre condizioni, due domini "self" e "d" sono compatibili se
"self == d or
( self.oclIsTypeOf(ConcreteDomain) and d.oclIsTypeOf(TypeDomain) and d = self.oclAsType(ConcreteDomain).typeDomain) "
Quindi non sono compatibili se
"( d.oclIsTypeOf(ConcreteDomain) and self.oclIsTypeOf(TypeDomain) and self = d.oclAsType(ConcreteDomain).typeDomain )"
Infatti il modello "wrongDomainAsActualParameter" genera un errore in esecuzione: vedi test "ActualParameterTest.test01" in "interpreter".
Vediamo il seguente modello:
-----------------------
asm correctDomainAsActualParameter
import ../../STDL/StandardLibrary
signature:
abstract domain Chan
domain ChanInt subsetof Chan
controlled f: Integer
dynamic controlled c: Chan
static ci: ChanInt
definitions:
macro rule r_m1($x in ChanInt) =
f := 1
main rule r_main=
seq
c := ci
r_m1[c]
endseq
default init s0:
function f = 3
-----------------------
Il modello "correctDomainAsActualParameter" viene parsato correttamente e dovrebbe anche essere eseguito correttamente.
Quando viene invocata la macro rule "r_m1", infatti, il dominio effettivo di "c" è "ChanInt" e non "Chan".
Il test "ActualParameterTest.test02" in "interpreter", però, solleva l'eccezione "NotCompatibleDomainsException".
Il problema nasce dal fatto che il dominio di un termine (il location term "c" usato come parametro attule di "r_m1[c]") viene fissato dal parser e non può cambiare in esecuzione. Nell'esempio, quindi, il dominio del termine "c" usato come parametro attule di "r_m1[c]" rimane sempre "Chan", anche se la funzione "c" è stata aggiornata a "ci" il cui dominio è "ChanInt".
Il problema si riferisce alla revisione 2389.