Simplified theory of the proximity effect in the limit of small pair
7.1 Weak proximity effect
O refinamentoleilao refpode ser refinado através da seguinte implementação:
IMPLEMENTATION leilao imp (OBJETOS) REFINES leilao ref
VALUES lance min = 100 IMPORTS leilaoVar (OBJETOS)
INVARIANT sessaoVar = rsessao ∧ leiloadosVar = rleiloados OPERATIONS
iniciar(obj) ˆ= VAR st IN
st ←− em sessao(obj)
IF obj ∈ OBJETOS ∧ st = FALSE THEN set sessao(lance min, obj) ELSE skip END END; propor(lance, obj) ˆ= VAR st1, st2, nn IN st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); nn ←− get(obj);
A. Especificações e Obrigações de Prova 94
IF st1 = TRUE ∧ st2 = TRUE THEN
IF lance > nn
THEN set sessao(lance, obj) ELSE skip END END END; encerrar(obj) ˆ= VAR st1, st2 IN
st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); IF st1 = TRUE ∧ st2 = TRUE
THEN set leiloados(obj) ELSE skip
END END;
resp, m ←− consultar(obj) ˆ= VAR st1, st2 IN
st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); IF st1 = TRUE
THEN m ←− get(obj); IF st2 = TRUE
THEN resp := aberto ELSE resp := fechado END
ELSE m := 0; resp := inexistente END
END END
A. Especificações e Obrigações de Prova 95
MACHINE leilaoVar (OBJETOS)
VARIABLES sessaoVar, leiloadosVar
INVARIANT sessaoVar ∈ OBJETOS → N1∧ leiloadosVar ⊆ dom(sessaoVar)
INITIALISATION sessaoVar, leiloadosVar := ∅, ∅ OPERATIONS
set sessao(lance, obj) ˆ=
PRE obj ∈ OBJETOS ∧ lance ∈ N1
THEN sessaoVar := sessaoVar ⊕ {obj → lance min} END;
set leiloados(obj) ˆ=
PRE obj ∈ dom(sessaoVar)
THEN leiloadosVar := leiloadosVar ∪ {obj} END;
resp ←− em sessao(obj) ˆ= PRE obj ∈ OBJETOS
THEN resp := bool(obj ∈ dom(sessaoVar)) END;
resp ←− nao leiloado(obj) ˆ= PRE obj ∈ OBJETOS
THEN resp := bool(obj /∈ leiloadosVar) END;
resp ←− get(obj) ˆ=
PRE obj ∈ dom(sessaoVar) THEN resp := sessaoVar(obj) END
A. Especificações e Obrigações de Prova 96
END
Para a verificação da implementação são geradas as seguintes obrigações de prova: Inicialização:
CM∧ DMI∧ Dimp ⇒ [SUBSimp ; SUBSI]¬ [SUBSR]¬ INVI
⇔
CM∧ TIPO PARAMMI∧ TIPO CONJMI∧ REST CONSTMI∧ TIPO PARAMimp∧ TIPO CONJimp∧ REST CONSTimp ⇒ [SUBSimp ; SUBSI]¬ [SUBSR]¬ INVI
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
∧ RESP ∈ P1(Z) ∧ RESP = {aberto, fechado, inexistente}
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
⇒ [sessaoVar, leiloadosVar := ∅, ∅] ¬ [rsessao, rleiloados := ∅, ∅]
¬ (sessaoVar = rsessao ∧ leiloadosVar = rleiloados) ⇔
∅ = ∅
Operação iniciar:
CM∧ DMI∧ Dimp∧ INVMI∧ PREMR ⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI ⇔
CM∧ TIPO PARAMMI∧ TIPO CONJMI∧ REST CONSTMI∧
TIPO PARAMimp∧ TIPO CONJimp∧ REST CONSTimp∧ INVMI∧ PREMR
⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
A. Especificações e Obrigações de Prova 97
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
∧ leiloadosVar = rleiloados ∧ obj ∈ OBJETOS \ dom(sessao) ∧ obj ∈ OBJETOS \ dom(rsessao)
⇒ [VAR st
IN st ←− em sessao(obj);
IF obj ∈ OBJETOS ∧ st = FALSE THEN set sessao(lance min, obj) ELSE skip END
END]
¬ [rsessao := rsessao ⊕ {obj → lance min}]
¬ (sessaoVar = rsessao ∧ leiloadosVar = rleiloados) ⇔
lance min ∈ N1
∧ sessao ∈ OBJETOS ↔ N1
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ sessaoVar = rsessao ∧ obj ∈ OBJETOS \ dom(sessao)
∧ obj ∈ OBJETOS \ dom(rsessao) ∧ obj ∈ OBJETOS lance min ∈ N1
∧ obj /∈ dom(sessaoVar)
⇒ sessaoVar ⊕ {obj → lance min} = rsessao ⊕ {obj → lance min}
Operação propor:
CM∧ DMI∧ Dimp∧ INVMI∧ PREMR ⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI
A. Especificações e Obrigações de Prova 98
CM∧ TIPO PARAMMI∧ TIPO CONJMI∧ REST CONSTMI∧
TIPO PARAMimp∧ TIPO CONJimp∧ REST CONSTimp∧ INVMI∧ PREMR
⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
∧ RESP ∈ P1(Z) ∧ RESP = {aberto, fechado, inexistente}
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
∧ leiloadosVar = rleiloados ∧ lance ∈ N1
∧ obj ∈ dom(sessao) \ leiloados ∧ obj ∈ dom(rsessao) \ rleiloados
⇒ [VAR st1, st2, nn IN st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); nn ←− get(obj); IF st1 = TRUE ∧ st2 = TRUE THEN IF lance > nn
THEN set sessao(lance, obj) ELSE skip END
ELSE skip END END]
¬ [rsessao := rsessao ⊕ {obj → lance}]
¬ (sessaoVar = rsessao ∧ leiloadosVar = rleiloados) ⇔
sessao ∈ OBJETOS ↔ N1
A. Especificações e Obrigações de Prova 99
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ sessaoVar = rsessao ∧ obj ∈ OBJETOS \ dom(sessao)
∧ obj ∈ OBJETOS \ dom(rsessao) ∧ obj ∈ OBJETOS ∧ obj ∈ dom(sessaoVar) ∧ obj /∈ leiloadosVar ∧ lance > sessaoVar(obj) ∧ lance ∈ N1
⇒ sessaoVar ⊕ {obj → lance} = rsessao ⊕ {obj → lance}
Operação encerrar:
CM∧ DMI∧ Dimp∧ INVMI∧ PREMR ⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI ⇔
CM∧ TIPO PARAMMI∧ TIPO CONJMI∧ REST CONSTMI∧
TIPO PARAMimp∧ TIPO CONJimp∧ REST CONSTimp∧ INVMI∧ PREMR ⇒ PREI∧ [SUBSI]¬ [SUBSR]¬ INVI
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
∧ RESP ∈ P1(Z) ∧ RESP = {aberto, fechado, inexistente}
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
∧ leiloadosVar = rleiloados ∧ obj ∈ dom(sessao) \ leiloados ∧ obj ∈ dom(rsessao) \ rleiloados
⇒ [VAR st1, st2
IN st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); IF st1 = TRUE ∧ st2 = TRUE THEN set leiloados(obj)
A. Especificações e Obrigações de Prova 100
ELSE skip END END]
¬ [rleiloados := rleiloados ∪ {obj}]
¬ (sessaoVar = rsessao ∧ leiloadosVar = rleiloados) ⇔
OBJETOS ∈ P1(Z)
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
∧ leiloadosVar = rleiloados ∧ obj ∈ dom(sessao) \ leiloados ∧ obj ∈ dom(rsessao) \ rleiloados ∧ obj ∈ OBJETOS
⇒ leiloadosVar ∪ {obj} = rleiloados ∪ {obj}
Operação consultar:
CM∧ DMI∧ Dimp∧ INVMI∧ PREMR
⇒ PREI∧ [SUBS’I]¬ [SUBSR]¬ (INVI∧ y’ = y)
⇔
CM∧ TIPO PARAMMI∧ TIPO CONJMI∧ REST CONSTMI∧
TIPO PARAMimp∧ TIPO CONJimp∧ REST CONSTimp∧ INVMI∧ PREMR
⇒ PREI∧ [SUBS’I]¬ [SUBSR]¬ (INVI∧ y’ = y)
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
∧ RESP ∈ P1(Z) ∧ RESP = {aberto, fechado, inexistente}
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
A. Especificações e Obrigações de Prova 101
∧ leiloadosVar = rleiloados ∧ obj ∈ dom(sessao) ∧ obj ∈ dom(rsessao) ⇒ [VAR st1, st2 IN st1 ←− em sessao(obj); st2 ←− nao leiloado(obj); IF st1 = TRUE THEN m’ ←− get(obj); IF st2 = TRUE
THEN resp’ := aberto ELSE resp’ := fechado END
ELSE m’ := 0; resp’ := inexistente END END]
¬ [IF obj /∈ rleiloados THEN resp := aberto ELSE resp := fechado END]
¬ (sessaoVar = rsessao ∧ leiloadosVar = rleiloados ∧ m’ = m ∧ resp’ = resp)
⇔
OBJETOS ∈ P1(Z) ∧ lance min ∈ N1
∧ RESP ∈ P1(Z) ∧ RESP = {aberto, fechado, inexistente}
∧ aberto = fechado ∧ aberto = inexistente ∧ fechado = inexistente ∧ card(OBJETOS) ∈ N1
∧ sessao ∈ OBJETOS ↔ N1∧ leiloados ⊆ dom(sessao)
∧ rsessao ∈ OBJETOS → N1∧ dom(rsessao) = dom(sessao)
∧ ∀x • (x ∈ dom(rsessao) ⇒ rsessao(x) = max(sessao[{x}])) ∧ rleiloados = leiloados ∧ sessaoVar = rsessao
∧ leiloadosVar = rleiloados ∧ obj ∈ dom(sessao) ∧ obj ∈ dom(rsessao)
⇒ obj ∈ OBJETOS
∧ (obj ∈ dom(sessaoVar) ∧ obj /∈ leiloadosVar ⇒ sessaoVar(obj) = rsessao(obj))
A. Especificações e Obrigações de Prova 102
∧ (obj ∈ dom(sessaoVar) ∧ obj ∈ leiloadosVar
⇒ sessaoVar(obj) = rsessao(obj) ∧ aberto = fechado) ∧ (obj ∈ dom(sessaoVar) ∧ obj ∈ leiloadosVar
∧ obj /∈ rleiloados)
⇒ sessaoVar(obj) = rsessao(obj) ∧ fechado = aberto) ∧ (obj /∈ dom(sessaoVar) ∧ obj /∈ rleiloados
⇒ 0 = rsessao(obj) ∧ inexistente = aberto) ∧ (obj /∈ dom(sessaoVar) ∧ obj ∈ rleiloados