Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 算术表达式与大步语义_Math_Expression_Coq_Semantics_Operational - Fatal编程技术网

Math 算术表达式与大步语义

Math 算术表达式与大步语义,math,expression,coq,semantics,operational,Math,Expression,Coq,Semantics,Operational,我正在做一个项目,我必须为算术表达式定义一个类型,为大步运算语义定义一个归纳谓词 首先,我开始定义一个赋值类型,并决定创建一个字符串*Z的列表 Definition valuation := list (string * Z). 然后我定义了一个用于应用估值的函数 Fixpoint apply_valuation (s : string) (v : valuation) : Z := match v with | nil => 0 | cons (s',v') q => if

我正在做一个项目,我必须为算术表达式定义一个类型,为大步运算语义定义一个归纳谓词

首先,我开始定义一个赋值类型,并决定创建一个字符串*Z的列表

Definition valuation  := list (string * Z).
然后我定义了一个用于应用估值的函数

Fixpoint apply_valuation (s : string) (v : valuation) : Z := 
match v with 
| nil => 0
| cons (s',v') q => if  (string_dec s' s) then v'
                else (apply_valuation s q)
end. 
这就是我定义算术表达式类型的方法:

Inductive EA : Type := 
| Cst (n : Z)
| Var (v : string) 
| Plus (a1 a2 : EA) 
| Minus (a1 a2 : EA) 
| Mult (a1 a2 : EA)
| Div (a1 a2 : EA).
我对大步语义的归纳谓词是

 Inductive Sem_AE (s : valuation) : EA -> Z -> Prop :=
| cst_sem : forall z, Sem_AE s (Cst z) z
| var_sem : forall v , Sem_AE s (Var v) (apply_valuation v s)
| plus_sem : forall e1 e2 z1 z2 , 
          Sem_AE s e1 z1 -> Sem_AE s e2 z2 -> Sem_AE s (Plus e1 e2) (z1 + z2)
| minus_sem : forall e1 e2 z1 z2 , 
         Sem_AE s e1 z1 ->  Sem_AE s e2 z2 ->  Sem_AE s (Minus e1 e2) (z1 - z2)
| mult_sem: forall e1 e2 z1 z2 , 
         Sem_AE s e1 z1 ->   Sem_AE s e2 z2 ->  Sem_AE s (Mult e1 e2) (z1 * z2)
| sem_Div : forall e1 e2 z1 z2 , 
         Sem_AE s e1 z1 ->  Sem_AE s e2 z2 -> Sem_AE s (Div e1 e2) (z1 / z2).
现在,我必须证明大步语义是决定性的,但当它到来时,我被卡住了,无法证明它的正确性

Lemma sem_det: forall s a z z', Sem_AE s a z -> Sem_AE s a z' -> z = z'.
Proof.
intros. induction H.
- inversion H0. reflexivity.
- inversion H0. reflexivity.
- inversion H0. subst.
这就是我的背景

1 subgoals
s : valuation
e1 : EA
e2 : EA
z1 : Z
z2 : Z
H : Sem_EA s e1 z1
H1 : Sem_EA s e2 z2
z0 : Z
z3 : Z
H4 : Sem_EA s e1 z0
H6 : Sem_EA s e2 z3
H0 : Sem_EA s (Plus e1 e2) (z0 + z3)
IHSem_EA1 : Sem_EA s e1 (z0 + z3) -> z1 = z0 + z3
IHSem_EA2 : Sem_EA s e2 (z0 + z3) -> z2 = z0 + z3
______________________________________(1/1)
 z1 + z2 = z0 + z3
你知道如何继续这个证明吗?我走的路对吗


非常感谢。

这是一个常见的问题。问题是你的归纳假设不够笼统。您可以通过对
z'
进行概括来解决此问题:

Lemma sem_det: forall s a z z', Sem_AE s a z -> Sem_AE s a z' -> z = z'.
Proof.
intros. generalize dependent z'. induction H; intros.
- inversion H0. reflexivity.
- inversion H0. reflexivity.
- inversion H1. subst.
  rewrite (IHSem_AE1 _ H4).
  now rewrite (IHSem_AE2 _ H6).
将广义证明的状态与您以前的尝试进行比较是有指导意义的。有关更多信息,请阅读


小提示:你的证明依赖于Coq为你生成的名字,因为这些选择是脆弱的,会导致您的校对脚本很容易被破坏。

这是一个常见的问题。问题是你的归纳假设不够笼统。您可以通过对
z'
进行概括来解决此问题:

Lemma sem_det: forall s a z z', Sem_AE s a z -> Sem_AE s a z' -> z = z'.
Proof.
intros. generalize dependent z'. induction H; intros.
- inversion H0. reflexivity.
- inversion H0. reflexivity.
- inversion H1. subst.
  rewrite (IHSem_AE1 _ H4).
  now rewrite (IHSem_AE2 _ H6).
将广义证明的状态与您以前的尝试进行比较是有指导意义的。有关更多信息,请阅读

小提示:你的证明依赖于Coq为你生成的名字,因为这些选择是脆弱的,并导致您的验证脚本很容易破坏