There are boolean, string, integer values in Exp.
Comparison follows the semantics we commonly use except that
false is less than true,
boolean is always less then integer,
and integer is always less than string.
----------------
E,O |- true : true
------------------
E,O |- false : false
-----------------------
E,O |- $string : string
----------
E,O |- n : n
E,O |- Exp1 : v1 E,) |- Exp2 : v2 v1 = v2
-------------------------------------------------------
E,O |- Exp1 = Exp2 : true
E,O |- Exp1 : v1 E,O |- Exp2 : v2 not (v1 = v2)
-------------------------------------------------------------
E,O |- Exp1 = Exp2 : false
E,0 |- Exp1 : v1 E,0 |- Exp2 : v2 v1 < v2
-------------------------------------------------------
E,O |- Exp1 < Exp2 : true
E,0 |- Exp1 : v1 E,O |- Exp2 : v2 not (v1 < v2)
-------------------------------------------------------------
E,O |- Exp1 < Exp2 : false
E,O |- Exp1 : v1 E,O |- Exp2 : v2 v1 > v2
-------------------------------------------------------
E,O |- Exp1 > Exp2 : true
E,O |- Exp1 : v1 E,O |- Exp2 : v2 not (v1 > v2)
-------------------------------------------------------------
E,O |- Exp1 < Exp2 : false
E,O |- Exp : true
--------------------
E,O |- ~ Exp : false
E,O |- Exp : v not (v = true)
----------------------------------
E,O |- ~ Exp : false
E,O |- Exp : v not (v = true)
----------------------------------
E,O |- ~ Exp : false
E,O |- Exp1 : n1 E |- Exp2 : n2 n = n1+n2
-----------------------------------------------------
E,O |- Exp1 + Exp2 : n
E,O |- Exp1 : v1 not (v1 ∈ N)
-------------------------------------
E,O |- Exp1 + Exp2 : false
E,O |- Exp1 : v2 not (v2 ∈ N)
-------------------------------------
E,O |- Exp1 + Exp2 : false
E,O |- Exp1 : n1 E,O |- Exp2 : n2 n = n1-n2
---------------------------------------------------------
E,O |- Exp1 - Exp2 : n
E,O |- Exp1 : v1 not (v1 ∈ N)
-------------------------------------
E,O |- Exp1 - Exp2 : false
E,O |- Exp1 : v2 not (v2 ∈ N)
-------------------------------------
E,O |- Exp1 - Exp2 : false
E,O |- Exp1 : n1 E |- Exp2 : n2 n = n1*n2
-----------------------------------------------------
E,O |- Exp1 * Exp2 : n
E,O |- Exp1 : v1 not (v1 ∈ N)
-------------------------------------
E,O |- Exp1 * Exp2 : false
E,O |- Exp1 : v2 not (v2 ∈ N)
-------------------------------------
E,O |- Exp1 * Exp2 : false
E,O |- Exp1 : n1 E,O |- Exp2 : n2 n = n1/n2 not (n2 = 0)
------------------------------------------------------------------------
E,O |- Exp1 / Exp2 : n
E,O |- Exp2 : 0
------------------------
E,O |- Exp1 / Exp2 : false
E,O |- Exp1 : v1 not (v1 ∈ N)
-------------------------------------
E,O |- Exp1 / Exp2 : false
E,O |- Exp1 : v2 not (v2 ∈ N)
-------------------------------------
E,O |- Exp1 / Exp2 : false
----------------
E,O |- var : var@E,O user defined interpretation of var on E,O
E,O |- Exp1 : v1 ... E |- Expn : vn
----------------------------------------------------
E,O |- var ( Exp1, ... , Expn ) : var(v1,...,vn)@E,O user defined interpretation of var(v1,...,vn) on E,O