Library CompOptCert.Language
Require Import Basic.
Set Implicit Arguments.
Require Import Event.
Module Language.
Section Language.
Definition fid: Type := IdentMap.key.
Structure t := mk {
syntax: Type;
state: Type;
init: syntax → fid → option state;
is_terminal: state → Prop;
step: ∀ (e: ProgramEvent.t) (s1: state) (s2: state), Prop;
Set Implicit Arguments.
Require Import Event.
Module Language.
Section Language.
Definition fid: Type := IdentMap.key.
Structure t := mk {
syntax: Type;
state: Type;
init: syntax → fid → option state;
is_terminal: state → Prop;
step: ∀ (e: ProgramEvent.t) (s1: state) (s2: state), Prop;
rtl is deterministic in itself, until it trys to read something from memory pool
deterministic:
∀ (st st1 st2: state) (e1 e2: ProgramEvent.t)
(STEP1: step e1 st st1)
(STEP2: step e2 st st2),
(e1 = e2 ∧ st1 = st2) ∨
(∃ or loc val1 val2, e1 = ProgramEvent.read loc val1 or ∧ e2 = ProgramEvent.read loc val2 or) ∨
(∃ or ow loc valr valw valr', e1 = ProgramEvent.update loc valr valw or ow ∧
e2 = ProgramEvent.read loc valr' or) ∨
(∃ or ow loc valr valw valr', e2 = ProgramEvent.update loc valr valw or ow ∧
e1 = ProgramEvent.read loc valr' or);
read_abitrary_1:
∀ (st1 st2: state) (val val': Const.t) loc ord
(READ: step (ProgramEvent.read loc val ord) st1 st2),
∃ st2',
step (ProgramEvent.read loc val' ord) st1 st2' ∨
(∃ valw ordw, step (ProgramEvent.update loc val' valw ord ordw) st1 st2');
read_abitrary_2:
∀ (st1 st2: state) (val val' valw: Const.t) loc ordr ordw
(UPDATE: step (ProgramEvent.update loc val valw ordr ordw) st1 st2),
∃ st2',
step (ProgramEvent.read loc val' ordr) st1 st2' ∨
step (ProgramEvent.update loc val' valw ordr ordw) st1 st2'
}.
End Language.
End Language.
Definition language: Type := Language.t.
∀ (st st1 st2: state) (e1 e2: ProgramEvent.t)
(STEP1: step e1 st st1)
(STEP2: step e2 st st2),
(e1 = e2 ∧ st1 = st2) ∨
(∃ or loc val1 val2, e1 = ProgramEvent.read loc val1 or ∧ e2 = ProgramEvent.read loc val2 or) ∨
(∃ or ow loc valr valw valr', e1 = ProgramEvent.update loc valr valw or ow ∧
e2 = ProgramEvent.read loc valr' or) ∨
(∃ or ow loc valr valw valr', e2 = ProgramEvent.update loc valr valw or ow ∧
e1 = ProgramEvent.read loc valr' or);
read_abitrary_1:
∀ (st1 st2: state) (val val': Const.t) loc ord
(READ: step (ProgramEvent.read loc val ord) st1 st2),
∃ st2',
step (ProgramEvent.read loc val' ord) st1 st2' ∨
(∃ valw ordw, step (ProgramEvent.update loc val' valw ord ordw) st1 st2');
read_abitrary_2:
∀ (st1 st2: state) (val val' valw: Const.t) loc ordr ordw
(UPDATE: step (ProgramEvent.update loc val valw ordr ordw) st1 st2),
∃ st2',
step (ProgramEvent.read loc val' ordr) st1 st2' ∨
step (ProgramEvent.update loc val' valw ordr ordw) st1 st2'
}.
End Language.
End Language.
Definition language: Type := Language.t.