aboutsummaryrefslogtreecommitdiff
path: root/src/Assembly/AlmostQhasm.v
blob: f3ed925c7bf1cf2a332a298f0ad59df51bc24f54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Require Import QhasmCommon QhasmEvalCommon.
Require Import Language.
Require Import List.

Module AlmostQhasm <: Language.
  Import QhasmEval.

  (* Program Types *)
  Definition Params := unit.
  Definition State := fun (_: Params) => State.

  Inductive AlmostProgram: Set :=
    | ASkip: AlmostProgram
    | ASeq: AlmostProgram -> AlmostProgram -> AlmostProgram
    | AAssign: Assignment -> AlmostProgram
    | AOp: Operation -> AlmostProgram
    | ACond: Conditional -> AlmostProgram -> AlmostProgram -> AlmostProgram
    | AWhile: Conditional -> AlmostProgram -> AlmostProgram
    | ADef: Label -> AlmostProgram -> AlmostProgram -> AlmostProgram
    | ACall: Label -> AlmostProgram.

  Hint Constructors AlmostProgram.

  Definition Program := fun (_: Params) => AlmostProgram.

  Fixpoint inline (l: nat) (f prog: AlmostProgram) :=
    match prog with
    | ASeq a b => ASeq (inline l f a) (inline l f b)
    | ACond c a b => ACond c (inline l f a) (inline l f b)
    | AWhile c a => AWhile c (inline l f a)
    | ADef l' f' p' =>
      if (Nat.eq_dec l l')
      then prog
      else ADef l' (inline l f f') (inline l f p')
    | ACall l' =>
      if (Nat.eq_dec l l')
      then f
      else prog
    | _ => prog
    end.

  Inductive AlmostEval {x: Params}: Program x -> State x -> State x -> Prop :=
    | AESkip: forall s, AlmostEval ASkip s s
    | AESeq: forall p p' s s' s'',
        AlmostEval p s s'
      -> AlmostEval p' s' s''
      -> AlmostEval (ASeq p p') s s''
    | AEAssign a: forall s s',
        evalAssignment a s = Some s'
      -> AlmostEval (AAssign a) s s'
    | AEOp: forall s s' a,
        evalOperation a s = Some s'
      -> AlmostEval (AOp a) s s'
    | AECondFalse: forall c a b s s',
        evalCond c s = Some false
      -> AlmostEval b s s'
      -> AlmostEval (ACond c a b) s s'
    | AECondTrue: forall c a b s s',
        evalCond c s = Some true
      -> AlmostEval a s s'
      -> AlmostEval (ACond c a b) s s'
    | AEWhileRun: forall c a s s' s'',
        evalCond c s = Some true
      -> AlmostEval a s s'
      -> AlmostEval (AWhile c a) s' s''
      -> AlmostEval (AWhile c a) s s''
    | AEWhileSkip: forall c a s,
        evalCond c s = Some false
        -> AlmostEval (AWhile c a) s s
    | AEFun: forall l f p s s',
        AlmostEval (inline l f p) s s'
        -> AlmostEval (ADef l f p) s s'.

  Definition evaluatesTo := @AlmostEval.

  (* world peace *)
End AlmostQhasm.