我无法解决应该使用指称语义的 Coq 定理。如果我从这一点继续前进,我总是陷入无限循环。
在这种情况下应该使用什么策略?我在哪里做错了这个?我应该以不同的方式开始吗?
From Coq Require Import Strings.String
Arith.PeanoNat
Arith.Plus.
Definition Ident : Type := string.
Inductive AExp : Type :=
| ALit (n : nat)
| AVar (s : Ident)
| APlus (a1 a2 : AExp)
| ADup (n : AExp)
.
Definition State := Ident -> nat.
Definition empty : State := fun x => 0.
Definition aState : State :=
fun x =>
match x with
| "X"%string => 1
| "Y"%string => 2
| "Z"%string => 42
| _ => 0
end
.
Definition X:Ident := "X"%string.
Definition Y:Ident := "Y"%string.
Definition Z:Ident := "Z"%string.
Fixpoint val (a : AExp) (s : State) : nat :=
match a with
| ALit n => n
| AVar x => s x
| APlus a1 a2 => val a1 s + val a2 s
| ADup a => val a s + val a s
end.
Fixpoint aqb (a1 a2 : AExp) : bool :=
match a1, a2 with
| ALit n, ALit m => Nat.eqb n m
| AVar s, AVar x => String.eqb s x
| APlus a1 a2, APlus a1' a2' => aqb a1 a1' && aqb a2 a2'
| ADup a1, ADup a1' => aqb a1 a1'
| _, _ => false
end.
Fixpoint optmal (a : AExp) : AExp :=
match a with
| APlus a1 a2 =>
if aqb a1 a2
then ADup (optmal a1)
else APlus (optmal a1) (optmal a2)
| ADup a0 => ADup (optmal a0)
| _ => a
end.
Theorem optmald :
forall a s, val a s = val (optmal a) s.
Proof.
intros. unfold val. induction a.
* simpl. reflexivity.
* simpl. reflexivity.
*