关于字符串的证明

时间:2012-07-09 10:11:08

标签: string coq

我想在字符串上证明'反身性'属性。如果你能帮助我如何进行证明,请。这是我的代码:

    Fixpoint beq_str (sa sb : String.string) {struct sb}: bool := 
   match sa, sb with
 | EmptyString, EmptyString  => true
 | EmptyString, String b sb' => false
 | String a sa', EmptyString => false
 | String a sa', String b sb'=> match (ascii_dec a b) with 
                                | left _ => beq_str sa' sb'
                                | right _ => false
                                end
 end.
 (* compares two string names [n1] and [n2] of type [id'] - returs bool. *) 
 Definition beq_names n1 n2 :=
  match (n1, n2) with
    (name s1, name s2) => beq_str s1 s2
  end.

 Theorem reflexivty : forall i,
  true = beq_str i i.
Proof.
  intros. induction i.
  auto.  simpl. Admitted.  

1 个答案:

答案 0 :(得分:1)

不确定是做作业还是独立学习......

Theorem beq_str_refl : forall i,
  true = beq_str i i.
Proof.
  induction 0; simpl; try (rewrite <- IHi; case (ascii_dec a a));
  try reflexivity; intro C; elimtype False; apply C; reflexivity.
Qed.

这应该有用。

如果这是家庭作业并且你很懒,那么你的导师会希望拒绝这一点。如果你想自己理解和证明,那么你需要的构建块就在那里,只需将它拆开并在当前的证明状态下抛出碎片。

这个证明有两件事。第一个是摆脱(ascii_dec a a)。 (a上的案例分析将不起作用。)对整个事物进行案例分析(即(ascii_dec a a))以获得两个子目标,一个具有添加的假设a = a,另一个与a <> a

第二个问题可能是矛盾,除非你之前已经这样做了。

a <> a相当于a = a -> False。根据定义,a = a是真的,它允许构造类型False的值(矛盾 - False没有构造函数)。这样你就可以抛弃你当前的目标(无论如何true = false无法证明),只需构造那个不可能的False值。

elimtype False告诉Coq您希望通过False上的案例分析来继续。由于False没有构造函数,因此您只需构建一个False值的目标。通常这是不可能的,但你的假设之间存在矛盾。 apply这个矛盾(在我上面的校对脚本中命名为C),您要做的就是显示a = a,后面是reflexivity


这是一个更易读的版本,您可以单步执行:

Theorem beq_str_refl : forall i, true = beq_str i i.
  intro i. induction i as [ | a i IHi ].
    (* base case: Empty String *) reflexivity.
    (* inductive case: *) simpl. rewrite <- IHi.
      (* do case analysis on ascii_dec (or {a=a}+{a<>a}) *)
      destruct (ascii_dec a a) as [ Heq | C ].
      (* {a =  a} *) reflexivity.
      (* {a <> a} *) unfold not in C. elimtype False. apply C. reflexivity.

处理矛盾的另一种方法:

(* just a quick nonsensical goal *)
Theorem foo: forall i, i <> i -> 2 + 2 = 5.
  intros i C.
  (* explicitly construct a 'False' value *)
  assert False as H.
    apply C. reflexivity.
  (* 'inversion' generates one goal per possible constructor *)
  (* as False has no constructors, this gives 0 subgoals, finishing the proof *)
  inversion H.
Qed.