feat: add list_copy
This commit is contained in:
parent
f95724f6ed
commit
39fab72600
@ -357,44 +357,90 @@ Definition test_list_copy (candidate : forall V : Type, list V -> list V) :=
|
|||||||
b. Implement the copy function recursively.
|
b. Implement the copy function recursively.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
(*
|
|
||||||
Fixpoint list_copy (V : Type) (vs : list V) : list V :=
|
Fixpoint list_copy (V : Type) (vs : list V) : list V :=
|
||||||
...
|
match vs with
|
||||||
*)
|
| nil => nil
|
||||||
|
| v :: vs' => v :: (list_copy V vs')
|
||||||
|
end.
|
||||||
|
|
||||||
(*
|
(*
|
||||||
c. State its associated fold-unfold lemmas.
|
c. State its associated fold-unfold lemmas.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
Lemma fold_unfold_list_copy_nil :
|
||||||
|
forall (V : Type),
|
||||||
|
list_copy V nil = nil.
|
||||||
|
Proof.
|
||||||
|
intro V.
|
||||||
|
fold_unfold_tactic list_copy.
|
||||||
|
Qed.
|
||||||
|
|
||||||
|
Lemma fold_unfold_list_copy_cons :
|
||||||
|
forall (V : Type)
|
||||||
|
(v : V)
|
||||||
|
(vs : list V),
|
||||||
|
list_copy V (v :: vs) = v :: list_copy V vs.
|
||||||
|
Proof.
|
||||||
|
intros V v vs.
|
||||||
|
fold_unfold_tactic list_copy.
|
||||||
|
Qed.
|
||||||
|
|
||||||
(*
|
(*
|
||||||
d. Prove whether your implementation satisfies the specification.
|
d. Prove whether your implementation satisfies the specification.
|
||||||
*)
|
*)
|
||||||
|
Theorem list_copy_satifies_the_specification_of_list_copy :
|
||||||
|
specification_of_list_copy list_copy.
|
||||||
|
Proof.
|
||||||
|
unfold specification_of_list_copy.
|
||||||
|
split.
|
||||||
|
- intro V.
|
||||||
|
exact (fold_unfold_list_copy_nil V).
|
||||||
|
- intros V v vs'.
|
||||||
|
exact (fold_unfold_list_copy_cons V v vs').
|
||||||
|
Qed.
|
||||||
|
|
||||||
|
|
||||||
(*
|
(*
|
||||||
e. Prove whether copy is idempotent.
|
e. Prove whether copy is idempotent.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
(*
|
|
||||||
Proposition list_copy_is_idempotent :
|
Proposition list_copy_is_idempotent :
|
||||||
forall (V : Type)
|
forall (V : Type)
|
||||||
(vs : list V),
|
(vs : list V),
|
||||||
list_copy V (list_copy V vs) = list_copy V vs.
|
list_copy V (list_copy V vs) = list_copy V vs.
|
||||||
Proof.
|
Proof.
|
||||||
Abort.
|
intros V vs.
|
||||||
*)
|
induction vs as [ | v vs' IHvs' ].
|
||||||
|
- rewrite -> 2 (fold_unfold_list_copy_nil V).
|
||||||
|
reflexivity.
|
||||||
|
- rewrite -> (fold_unfold_list_copy_cons V v vs').
|
||||||
|
rewrite -> (fold_unfold_list_copy_cons V v (list_copy V vs')).
|
||||||
|
rewrite -> IHvs'.
|
||||||
|
reflexivity.
|
||||||
|
Qed.
|
||||||
|
|
||||||
(*
|
(*
|
||||||
f. Prove whether copying a list preserves its length.
|
f. Prove whether copying a list preserves its length.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
(*
|
|
||||||
Proposition list_copy_preserves_list_length :
|
Proposition list_copy_preserves_list_length :
|
||||||
forall (V : Type)
|
forall (V : Type)
|
||||||
(vs : list V),
|
(vs : list V),
|
||||||
list_length V (list_copy V vs) = list_length V vs.
|
list_length V (list_copy V vs) = list_length V vs.
|
||||||
Proof.
|
Proof.
|
||||||
Abort.
|
intros V vs.
|
||||||
*)
|
induction vs as [ | v vs' IHvs' ].
|
||||||
|
- rewrite -> (fold_unfold_list_copy_nil V).
|
||||||
|
reflexivity.
|
||||||
|
- rewrite -> (fold_unfold_list_copy_cons V v vs').
|
||||||
|
rewrite -> (fold_unfold_list_length_cons V v (list_copy V vs')).
|
||||||
|
rewrite -> IHvs'.
|
||||||
|
rewrite -> (fold_unfold_list_length_cons V v vs').
|
||||||
|
reflexivity.
|
||||||
|
Qed.
|
||||||
|
|
||||||
(*
|
(*
|
||||||
g. Subsidiary question: can you think of a strikingly simple implementation of the copy function?
|
g. Subsidiary question: can you think of a strikingly simple implementation of the copy function?
|
||||||
@ -402,6 +448,43 @@ Abort.
|
|||||||
is it equivalent to your recursive implementation?
|
is it equivalent to your recursive implementation?
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
Definition identity (V : Type) (vs : list V) := vs.
|
||||||
|
|
||||||
|
Theorem identity_satisfies_the_specification_of_copy :
|
||||||
|
specification_of_list_copy identity.
|
||||||
|
Proof.
|
||||||
|
unfold specification_of_list_copy.
|
||||||
|
split.
|
||||||
|
- intro V.
|
||||||
|
unfold identity.
|
||||||
|
reflexivity.
|
||||||
|
- intros V v vs'.
|
||||||
|
unfold identity.
|
||||||
|
reflexivity.
|
||||||
|
Qed.
|
||||||
|
|
||||||
|
Theorem about_list_copy :
|
||||||
|
forall (V : Type)
|
||||||
|
(vs : list V),
|
||||||
|
list_copy V vs = vs.
|
||||||
|
Proof.
|
||||||
|
intros V vs.
|
||||||
|
induction vs as [ | v vs' IHvs'].
|
||||||
|
- exact (fold_unfold_list_copy_nil V).
|
||||||
|
- rewrite -> (fold_unfold_list_copy_cons V v vs').
|
||||||
|
rewrite -> IHvs'.
|
||||||
|
reflexivity.
|
||||||
|
Qed.
|
||||||
|
|
||||||
|
Theorem identity_and_list_copy_are_equivalent :
|
||||||
|
forall (V : Type)
|
||||||
|
(vs : list V),
|
||||||
|
list_copy V vs = identity V vs.
|
||||||
|
Proof.
|
||||||
|
intros V vs.
|
||||||
|
unfold identity.
|
||||||
|
exact (about_list_copy V vs).
|
||||||
|
Qed.
|
||||||
(* ********** *)
|
(* ********** *)
|
||||||
|
|
||||||
(* A study of the polymorphic append function: *)
|
(* A study of the polymorphic append function: *)
|
||||||
|
Loading…
Reference in New Issue
Block a user