aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Robert Sloan <varomodt@gmail.com>2016-04-25 12:56:07 -0400
committerGravatar Robert Sloan <varomodt@gmail.com>2016-06-22 13:43:22 -0400
commit4901b7578442f6e2b37ae2dc19d8f7abea4575ac (patch)
treeeafec6403e2870b1b92fab4fd706497ada376824
parent51b54a6af948d169e17ccacf7ef78c798eec803d (diff)
Pseudo Evaluation Done
-rw-r--r--src/Assembly/Pseudo.v111
1 files changed, 47 insertions, 64 deletions
diff --git a/src/Assembly/Pseudo.v b/src/Assembly/Pseudo.v
index 335f1abd1..0521a686a 100644
--- a/src/Assembly/Pseudo.v
+++ b/src/Assembly/Pseudo.v
@@ -33,7 +33,7 @@ Module Pseudo <: Language.
| PComb: forall n a b, Pseudo n a -> Pseudo n b -> Pseudo n (a + b)
| PIf: forall n m, TestOp -> Index n -> Index n -> Pseudo n m -> Pseudo n m -> Pseudo n m
- | PFunExp: forall n k, nat -> Pseudo n k -> Pseudo (n + k) n -> nat -> Pseudo n n.
+ | PFunExp: forall n, Pseudo n n -> nat -> Pseudo n n.
Hint Constructors Pseudo.
@@ -53,7 +53,7 @@ Module Pseudo <: Language.
| Wzeros => None
end.
- Definition applyShift (op: WShiftOp) (v: word 32): option (list (word 32)) :=
+ Definition applyShift (op: WShiftOp) (v: word 32) (n: nat): option (list (word 32)) :=
match op with
| Wshl => None
| Wshr => None
@@ -74,68 +74,51 @@ Module Pseudo <: Language.
-> PseudoEval n m (PBin n m op a b) s s'
| PENat: forall n op v s s',
- applyNat op v s'
- -> PseudoEval n (PNat n v) s s'
-
- | PEShift: forall n, WShiftOp -> Pseudo n 1 -> nat -> Pseudo n 1
-
-.
-
- | PELet: forall n m, Pseudo n k -> Pseudo (n + k) m -> Pseudo n m
- | PEComp: forall n k m, Pseudo n k -> Pseudo k m -> Pseudo n m
- | PEComb: forall n a b, Pseudo n a -> Pseudo n b -> Pseudo n (a + b)
-
- | PEIf: forall n m, TestOp -> Index n -> Index n -> Pseudo n m -> Pseudo n m -> Pseudo n m
- | PEFunExp: forall n k, nat -> Pseudo n k -> Pseudo (n + k) n -> nat -> Pseudo n n
- .
-
- | PELet: forall n v x p p' s s',
- substitute v x p = Some p'
- -> PseudoEval n p' s s'
- -> PseudoEval n (PLet n v x p) s s'
-
- | PECombine: forall n m, Pseudo n -> Pseudo m -> Pseudo (n + m)
- | PELeft: forall n m, Pseudo (n + m) -> Pseudo n
- | PERight: forall n m, Pseudo (n + m) -> Pseudo m
-
- | PEUnit: forall n, Pseudo n -> Pseudo n
- | PEBinOp: WBinOp -> Pseudo 1 -> Pseudo 1 -> Pseudo 1
- | PENatOp: WNatOp -> nat -> Pseudo 1
- | PEShiftOp: WShiftOp -> Pseudo 1 -> nat -> Pseudo 1
-
- | PEIf: forall n, TestOp -> Pseudo 1 -> Pseudo 1 ->
- Pseudo n -> Pseudo n -> Pseudo n
-
- | PEFunExp: forall n, nat -> Pseudo n -> Pseudo n -> nat -> Pseudo n.
-
- | 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.
-
- Definition evaluatesTo := AlmostEval.
+ applyNat op v = Some s'
+ -> PseudoEval n 1 (PNat n v) s s'
+
+ | PEShift: forall n m a s s' w op,
+ applyShift op w m = Some s'
+ -> PseudoEval n 1 a s [w]
+ -> PseudoEval n 1 (PShift n op a m) s s'
+
+ | PELet: forall n m k s x s' a b,
+ PseudoEval n k a s x
+ -> PseudoEval (n + k) m b (s ++ x) s'
+ -> PseudoEval n m (PLet n k m a b) s s'
+
+ | PEComp: forall n k m s s' s'' a b,
+ PseudoEval n k a s s'
+ -> PseudoEval k m b s' s''
+ -> PseudoEval n m (PComp n k m a b) s s''
+
+ | PEComb: forall n a b x y s sx sy,
+ PseudoEval n a x s sx
+ -> PseudoEval n b y s sy
+ -> PseudoEval n (a + b) (PComb n a b x y) s (sx ++ sy)
+
+ | PEIfTrue: forall n m t x y s sx wx wy (i0 i1: Index n),
+ nth_error s i0 = Some wx
+ -> evalTest t wx wy = true
+ -> PseudoEval n m x s sx
+ -> PseudoEval n m (PIf n m t i0 i1 x y) s sx
+
+ | PEIfFalse: forall n m t x y s sy wx wy (i0 i1: Index n),
+ nth_error s i1 = Some wy
+ -> evalTest t wx wy = false
+ -> PseudoEval n m y s sy
+ -> PseudoEval n m (PIf n m t i0 i1 x y) s sy
+
+ | PEFunExpO: forall n f s,
+ PseudoEval n n (PFunExp n f O) s s
+
+ | PEFunExpS: forall n f s s' s'' e e',
+ e = S e'
+ -> PseudoEval n n f s s'
+ -> PseudoEval n n (PFunExp n f e') s' s''
+ -> PseudoEval n n (PFunExp n f e) s s''.
+
+ Definition evaluatesTo := PseudoEval.
(* world peace *)
End AlmostQhasm.