nus/cs3234/labs/question-for-Yadunand-Prem-midterm.txt
2024-05-08 16:20:16 +08:00

86 lines
2.7 KiB
Plaintext

% question-for-Yadunand-Prem.txt
% CS3234, Fri 05 Apr 2024
%%%%%%%%%%
This oral exam is a continuation of the midterm project.
So, make a copy of midterm_project.v (naming it midterm_project_copy-for-oral-exam.v)
and start editing this file after
(* end of midterm_project.v *)
%%%%%%%%%%
The goal of this oral exam is to revisit
Proposition list_reverse_acc_and_list_append_commute_with_each_other :
forall (V : Type)
(v1s v2s: list V),
list_append V (list_reverse_acc V v2s nil) (list_reverse_acc V v1s nil) =
list_reverse_acc V (list_append V v1s v2s) nil.
So, copy the following proposition at the very end of midterm_project_copy-for-oral-exam.v:
Proposition a_generalized_alternative :
forall (V : Type)
(v1s v2s v3s : list V),
list_reverse_acc V (list_append V v1s v2s) v3s
= nil.
%%%%%
a. The first thing to do is to figure out what to put instead of nil on the right-hand side,
so that the equality holds.
We (in the sense of you) are going to do that empirically by testing.
To this end, write:
Proof.
Compute (let V := nat in
let v1s := 11 :: 12 :: nil in
let v2s := 21 :: 22 :: nil in
let v3s := 31 :: 32 :: nil in
list_reverse_acc V (list_append V v1s v2s) v3s
= nil).
Then, replace nil on the right-hand-side by an expression that does not use list_append
but that only uses two occurrences of list_reverse_acc,
and that is such that the equality holds.
(Let us name this expression as YOUR_EXPRESSION.)
Hint: use "(list_reverse_acc V ... ...)" as an accumulator for list_reverse_acc.
b. To make sure, write:
Compute (let V := nat in
let v1s := 11 :: 12 :: nil in
let v2s := 21 :: 22 :: nil in
let v3s := 31 :: 32 :: nil in
eqb_list
nat
Nat.eqb
(list_reverse_acc V (list_append V v1s v2s) v3s)
YOUR_EXPRESSION).
Verify that the result of this computation is true.
If it is false, then go back to a. and revise YOUR_EXPRESSION
until the result of the computation just above is true.
c. Prove this equality by induction.
d. Time permitting, write:
Restart.
Prove these equalities not by induction,
but using the many properties you have proved earlier in the file,
e.g., about_list_reverse_acc_and_append,
list_reverse_acc_and_list_append_commute_with_each_other,
list_append_is_associative,
etc.
(Maybe you will need to state and prove more similar properties to carry our this proof,
maybe not, who knows, this is an exploration.)
%%%%%%%%%%
% end of question-for-Yadunand-Prem.txt