Rel关系的性质
令人困惑的是,“关系”原本是个更为通用的词语,然而 Coq 标准库中的“关系”
却单指这一种“某个集合中的元素之间二元关系”。为了与标准库保持一致,
我们将会沿用这一定义。然而“关系”一词除了指这一意义以外,
也可以指代任何数量的,可能是不同集合之间的更一般的关系。
在讨论中使用“关系”一词时,应该在上下文中解释具体所指的含义。
一个关系的例子是 nat 上的 le,即“小于或等于”关系,我们通常写作
n1 ≤ n2。
Print le.
(* ====> Inductive le (n : nat) : nat -> Prop :=
le_n : n <= n
| le_S : forall m : nat, n <= m -> n <= S m *)
Check le : nat → nat → Prop.
Check le : relation nat.
(为什么我们不直接写成 Inductive le : relation nat... 呢?
这是因为我们想要将第一个 nat 放在 : 的左侧,这能让 Coq 为 ≤
更为友好的的归纳法则。)
基本性质
偏函数
例如,之前定义的 next_nat 关系就是个偏函数。
Print next_nat.
(* ====> Inductive next_nat (n : nat) : nat -> Prop :=
nn : next_nat n (S n) *)
Check next_nat : relation nat.
Theorem next_nat_partial_function :
partial_function next_nat.
然而,数值上的 ≤ 关系并不是个偏函数。(利用反证法,假设 ≤
是一个偏函数。然而根据其定义我们有 0 ≤ 0 和 0 ≤ 1,这样会推出
0 = 1。这是不可能的,所以原假设不成立。)
(* 请在此处解答 *)
☐
(* 请在此处解答 *)
☐
Definition reflexive {X: Type} (R: relation X) :=
∀ a : X, R a a.
Theorem le_reflexive :
reflexive le.
Definition transitive {X: Type} (R: relation X) :=
∀ a b c : X, (R a b) → (R b c) → (R a c).
Theorem le_trans :
transitive le.
Proof.
intros n m o Hnm Hmo.
induction Hmo.
- (* le_n *) apply Hnm.
- (* le_S *) apply le_S. apply IHHmo. Qed.
intros n m o Hnm Hmo.
induction Hmo.
- (* le_n *) apply Hnm.
- (* le_S *) apply le_S. apply IHHmo. Qed.
Theorem lt_trans:
transitive lt.
练习:2 星, standard, optional (le_trans_hard_way)
我们也可以不用 le_trans,直接通过归纳法来证明 lt_trans, 不过这会耗费更多精力。请完成以下定理的证明。Theorem lt_trans' :
transitive lt.
Proof.
(* 根据 m 小于 o 的证据用归纳法证明它。 *)
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
induction Hmo as [| m' Hm'o].
(* 请在此处解答 *) Admitted.
☐
Theorem lt_trans'' :
transitive lt.
Proof.
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
induction o as [| o'].
(* 请在此处解答 *) Admitted.
unfold lt. unfold transitive.
intros n m o Hnm Hmo.
induction o as [| o'].
(* 请在此处解答 *) Admitted.
☐
le 的传递性反过来也能用于证明一些之后会用到的事实,
例如后面对反对称性的证明:
练习:2 星, standard, optional (le_Sn_n_inf)
请提写出以下定理的非形式化证明:
(* 请在此处解答 *)
☐
☐
对称关系与反对称关系
预序和偏序差不多,不过它无需满足反对称性。
Definition preorder {X:Type} (R: relation X) :=
(reflexive R) ∧ (transitive R).
Theorem le_order :
order le.
Proof.
unfold order. split.
- (* refl *) apply le_reflexive.
- split.
+ (* antisym *) apply le_antisymmetric.
+ (* transitive. *) apply le_trans. Qed.
unfold order. split.
- (* refl *) apply le_reflexive.
- split.
+ (* antisym *) apply le_antisymmetric.
+ (* transitive. *) apply le_trans. Qed.
Inductive clos_refl_trans {A: Type} (R: relation A) : relation A :=
| rt_step x y (H : R x y) : clos_refl_trans R x y
| rt_refl x : clos_refl_trans R x x
| rt_trans x y z
(Hxy : clos_refl_trans R x y)
(Hyz : clos_refl_trans R y z) :
clos_refl_trans R x z.
例如,next_nat 关系的自反传递闭包实际上就是 le。
Theorem next_nat_closure_is_le : ∀ n m,
(n ≤ m) ↔ ((clos_refl_trans next_nat) n m).
Proof.
intros n m. split.
- (* -> *)
intro H. induction H.
+ (* le_n *) apply rt_refl.
+ (* le_S *)
apply rt_trans with m. apply IHle. apply rt_step.
apply nn.
- (* <- *)
intro H. induction H.
+ (* rt_step *) inversion H. apply le_S. apply le_n.
+ (* rt_refl *) apply le_n.
+ (* rt_trans *)
apply le_trans with y.
apply IHclos_refl_trans1.
apply IHclos_refl_trans2. Qed.
intros n m. split.
- (* -> *)
intro H. induction H.
+ (* le_n *) apply rt_refl.
+ (* le_S *)
apply rt_trans with m. apply IHle. apply rt_step.
apply nn.
- (* <- *)
intro H. induction H.
+ (* rt_step *) inversion H. apply le_S. apply le_n.
+ (* rt_refl *) apply le_n.
+ (* rt_trans *)
apply le_trans with y.
apply IHclos_refl_trans1.
apply IHclos_refl_trans2. Qed.
以上对自反传递闭包的定义十分自然:它直接将自反传递闭包定义为“包含
R 的,同时满足自反性和传递性的最小的关系”。
然而此定义对于证明来说不是很方便,因为 rt_trans 的“非确定性”
有时会让归纳变得很棘手。下面是最常用的定义:
Inductive clos_refl_trans_1n {A : Type}
(R : relation A) (x : A)
: A → Prop :=
| rt1n_refl : clos_refl_trans_1n R x x
| rt1n_trans (y z : A)
(Hxy : R x y) (Hrest : clos_refl_trans_1n R y z) :
clos_refl_trans_1n R x z.
这一新的定义将 rt_step 和 rt_trans 合并成一条。在此规则的假设中
R 只用了一次,这会让归纳法则更简单。
在使用这一定义并继续之前,我们需要检查这两个定义确实定义了相同的关系...
首先,我们来证明 clos_refl_trans_1n 模仿了两个“缺失”
的 clos_refl_trans 构造子的行为。
Lemma rsc_trans :
∀ (X:Type) (R: relation X) (x y z : X),
clos_refl_trans_1n R x y →
clos_refl_trans_1n R y z →
clos_refl_trans_1n R x z.
Proof.
(* 请在此处解答 *) Admitted.
☐
∀ (X:Type) (R: relation X) (x y z : X),
clos_refl_trans_1n R x y →
clos_refl_trans_1n R y z →
clos_refl_trans_1n R x z.
Proof.
(* 请在此处解答 *) Admitted.
☐
Theorem rtc_rsc_coincide :
∀ (X:Type) (R: relation X) (x y : X),
clos_refl_trans R x y ↔ clos_refl_trans_1n R x y.
Proof.
(* 请在此处解答 *) Admitted.
☐
∀ (X:Type) (R: relation X) (x y : X),
clos_refl_trans R x y ↔ clos_refl_trans_1n R x y.
Proof.
(* 请在此处解答 *) Admitted.
☐
(* 2022-03-14 05:26:58 (UTC+00) *)