Skip to content
Snippets Groups Projects
Commit 55e93ffd authored by Robbert Krebbers's avatar Robbert Krebbers Committed by Marijn van Wezel
Browse files

Renames and make use of `set_solver` to shorten proof.

parent 7f43d3f2
No related branches found
No related tags found
1 merge request!584Add lemma `StronglySorted_app_iff`
(** Merge sort. Adapted from the implementation of Hugo Herbelin in the Coq (** Merge sort. Adapted from the implementation of Hugo Herbelin in the Coq
standard library, but without using the module system. *) standard library, but without using the module system. *)
From Coq Require Export Sorted. From Coq Require Export Sorted.
From stdpp Require Export orders list. From stdpp Require Export orders list sets.
From stdpp Require Import options. From stdpp Require Import options.
Section merge_sort. Section merge_sort.
...@@ -48,48 +48,36 @@ Inductive TlRel {A} (R : relation A) (a : A) : list A → Prop := ...@@ -48,48 +48,36 @@ Inductive TlRel {A} (R : relation A) (a : A) : list A → Prop :=
Section sorted. Section sorted.
Context {A} (R : relation A). Context {A} (R : relation A).
Lemma StronglySorted_app_iff l1 l2 : Lemma StronglySorted_cons l x :
StronglySorted R (l1 ++ l2) StronglySorted R (x :: l)
Forall (R x) l StronglySorted R l.
Proof. split; [inv 1|constructor]; naive_solver. Qed.
Lemma StronglySorted_app l1 l2 :
StronglySorted R (l1 ++ l2)
( x1 x2, x1 l1 x2 l2 R x1 x2) ( x1 x2, x1 l1 x2 l2 R x1 x2)
StronglySorted R l1 StronglySorted R l1
StronglySorted R l2. StronglySorted R l2.
Proof. Proof.
induction l1 as [|x1' l1 IH]; simpl; split. induction l1 as [|x1' l1 IH]; simpl.
- intros Hs. repeat split; [|constructor|naive_solver]. - set_solver by eauto using SSorted_nil.
by setoid_rewrite elem_of_nil. - rewrite !StronglySorted_cons, IH, !Forall_forall. set_solver.
- naive_solver.
- intros [Hs Hall]%StronglySorted_inv. split.
* intros ? ? Hinl1 Hinl2.
apply elem_of_cons in Hinl1 as [Hinl1|Hinl1].
+ subst. apply Forall_app in Hall as [_ Hall].
rewrite Forall_forall in Hall. by apply Hall.
+ apply IH in Hs as (HR & ? & ?). by apply HR.
* repeat split; [apply SSorted_cons|]; apply IH in Hs.
+ naive_solver.
+ apply Forall_app in Hall; naive_solver.
+ naive_solver.
- intros (HR & [? ?]%StronglySorted_inv & ?). apply SSorted_cons.
* apply IH; [|done..]. repeat split; [|done..].
intros; apply HR; [|done]. apply elem_of_cons. naive_solver.
* rewrite Forall_app; split; [done|].
rewrite Forall_forall. intros; apply HR; [|done].
apply elem_of_cons. naive_solver.
Qed. Qed.
Lemma StronglySorted_app l1 l2 : Lemma StronglySorted_app_2 l1 l2 :
( x1 x2, x1 l1 x2 l2 R x1 x2) ( x1 x2, x1 l1 x2 l2 R x1 x2)
StronglySorted R l1 StronglySorted R l1
StronglySorted R l2 StronglySorted R l2
StronglySorted R (l1 ++ l2). StronglySorted R (l1 ++ l2).
Proof. by rewrite StronglySorted_app_iff. Qed. Proof. by rewrite StronglySorted_app. Qed.
Lemma elem_of_StronglySorted_app l1 l2 x1 x2 : Lemma StronglySorted_app_1_elem_of l1 l2 x1 x2 :
StronglySorted R (l1 ++ l2) x1 l1 x2 l2 R x1 x2. StronglySorted R (l1 ++ l2) x1 l1 x2 l2 R x1 x2.
Proof. rewrite StronglySorted_app_iff. naive_solver. Qed. Proof. rewrite StronglySorted_app. naive_solver. Qed.
Lemma StronglySorted_app_inv_l l1 l2 : Lemma StronglySorted_app_1_l l1 l2 :
StronglySorted R (l1 ++ l2) StronglySorted R l1. StronglySorted R (l1 ++ l2) StronglySorted R l1.
Proof. rewrite StronglySorted_app_iff. naive_solver. Qed. Proof. rewrite StronglySorted_app. naive_solver. Qed.
Lemma StronglySorted_app_inv_r l1 l2 : Lemma StronglySorted_app_1_r l1 l2 :
StronglySorted R (l1 ++ l2) StronglySorted R l2. StronglySorted R (l1 ++ l2) StronglySorted R l2.
Proof. rewrite StronglySorted_app_iff. naive_solver. Qed. Proof. rewrite StronglySorted_app. naive_solver. Qed.
Lemma Sorted_StronglySorted `{!Transitive R} l : Lemma Sorted_StronglySorted `{!Transitive R} l :
Sorted R l StronglySorted R l. Sorted R l StronglySorted R l.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment