我想在字符串上证明'反身性'属性。如果你能帮助我如何进行证明,请。这是我的代码:
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.
答案 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.