@@ -635,7 +635,6 @@ Theorem fp_add_sub_correct:
635
635
∀ st1 st2 env e r.
636
636
is_rewriteFPexp_correct [fp_add_sub] st1 st2 env e r
637
637
Proof
638
- cheat (*
639
638
rw[is_rewriteFPexp_correct_def]
640
639
\\ qspecl_then [`e`] strip_assume_tac
641
640
(ONCE_REWRITE_RULE [DISJ_COMM] fp_add_sub_cases)
@@ -650,114 +649,76 @@ Proof
650
649
\\ qpat_x_assum `_ = (_, _)` (mp_tac o SIMP_RULE std_ss [evaluate_def])
651
650
\\ simp[REVERSE_DEF, astTheory.getOpClass_def, astTheory.isFpBool_def,
652
651
Once evaluate_cons, evaluate_case_case]
653
- \\ disch_then (mp_tac o (SIMP_RULE std_ss [evaluate_def]))
654
- \\ simp[REVERSE_DEF, astTheory.getOpClass_def, astTheory.isFpBool_def,
655
- Once evaluate_cons, evaluate_case_case]
656
- \\ ntac 2 (TOP_CASE_TAC \\ fs[])
657
- \\ rename1 ‘evaluate st1 env [e2] = (st1N, Rval v2)’
652
+ \\ ntac 4 (TOP_CASE_TAC \\ fs[])
658
653
\\ imp_res_tac evaluate_sing \\ rveq \\ fs[]
659
- \\ ‘st1N.fp_state.canOpt = FPScope Opt’ by fp_inv_tac
660
- \\ fs[]
661
- \\ simp[do_app_def, CaseEq"option", CaseEq"v", CaseEq"prod", CaseEq"result"]
654
+ \\ simp[do_app_def, CaseEq" option" , CaseEq" v" , CaseEq" prod" ]
662
655
\\ rpt strip_tac \\ rveq \\ fs[] \\ rveq
663
- \\ ntac 2 (pop_assum mp_tac)
664
- \\ imp_res_tac evaluate_sing \\ rveq \\ fs[]
665
- \\ rveq
666
- \\ simp[CaseEq"option",CaseEq"v"]
667
- \\ rename [‘evaluate
668
- (shift_fp_opts st1N with <| refs := st1N.refs; ffi:=st1N.ffi|>)
669
- env [e1] = (st2N, Rval [v1])’,
670
- ‘evaluate st1 env [e2] = (st1N, Rval [v2])’]
671
- \\ rpt strip_tac \\ rveq \\ fs[]
672
- \\ ‘st2N.fp_state.canOpt = FPScope Opt’ by (fp_inv_tac \\ fs[shift_fp_opts_def])
656
+ \\ rename [‘evaluate st1 env [e1] = (st2, Rval [v1])’,
657
+ ‘evaluate st2 env [e2] = (st3, Rval [v2])’]
658
+ \\ ‘st3.fp_state.canOpt = FPScope Opt’ by fp_inv_tac
673
659
\\ fs[]
674
- \\ ‘st1N = st1 with fp_state := st1N.fp_state’
660
+ \\ ‘st2 = st1 with fp_state := st2.fp_state ∧
661
+ st3 = st1 with fp_state := st3.fp_state’
675
662
by (imp_res_tac isPureExp_same_ffi \\ fs[isPureExp_def]
676
663
\\ res_tac \\ fs[state_component_equality])
677
- \\ ‘st2N = st1 with fp_state := st2N.fp_state’
678
- by (imp_res_tac isPureExp_same_ffi \\ fs[isPureExp_def]
679
- \\ res_tac \\ fs[state_component_equality, shift_fp_opts_def])
680
- \\ qpat_assum ‘evaluate _ _ [e1] = _’
681
- (mp_then Any mp_tac isPureExp_evaluate_change_oracle)
664
+ \\ qpat_assum `evaluate _ _ [e2] = _`
665
+ (mp_then Any mp_tac isPureExp_evaluate_change_oracle)
666
+ \\ fs[isPureExp_def]
682
667
\\ disch_then (
683
668
qspecl_then [
684
669
‘fp_add_sub’,
685
- ‘st1 with fp_state := st1.fp_state with
686
- <| opts := st1N.fp_state.opts;
687
- choices := st1.fp_state.choices + (st1N.fp_state.choices - st1.fp_state.choices) |>’,
688
- ‘λ x. if (x = 0) then
689
- [RewriteApp Here (LENGTH st1.fp_state.rws + 1)] ++
690
- (case
691
- do_fprw (Rval (FP_WordTree (fp_uop FP_Neg w1)))
692
- (st1N.fp_state.opts 0) st1N.fp_state.rws
693
- of
694
- NONE => []
695
- | SOME r_opt =>
696
- (MAP (λ x. case x of |RewriteApp p id => RewriteApp (Right p) id) ((st1N.fp_state.opts 0)))) ++
697
- (case do_fprw (Rval (FP_WordTree (fp_bop FP_Add w1' w2)))
698
- (st2N.fp_state.opts 0) st2N.fp_state.rws of
699
- | NONE => []
700
- | SOME r_opt => st2N.fp_state.opts x)
701
- else []’]
702
- mp_tac)
703
- \\ fs[isPureExp_def]
704
- \\ impl_tac >- (fp_inv_tac \\ fs[shift_fp_opts_def])
670
+ ‘st1 with fp_state := st1.fp_state with choices :=
671
+ st1.fp_state.choices + (st3.fp_state.choices - st2.fp_state.choices)’,
672
+ ‘λ x. if (x = 0 )
673
+ then [RewriteApp Here (LENGTH st1.fp_state.rws + 1 )] ++
674
+ (case do_fprw (Rval (FP_WordTree (fp_bop FP_Sub w1 w2)))
675
+ (st3.fp_state.opts 0 ) st3.fp_state.rws of
676
+ | NONE => [] | SOME r_opt => st3.fp_state.opts x)
677
+ else []’] mp_tac)
678
+ \\ impl_tac >- fp_inv_tac
705
679
\\ strip_tac
706
- \\ qpat_assum `evaluate _ _ [e2 ] = _`
680
+ \\ qpat_assum `evaluate _ _ [e1 ] = _`
707
681
(mp_then Any mp_tac isPureExp_evaluate_change_oracle)
682
+ \\ fs[isPureExp_def]
708
683
\\ disch_then (
709
684
qspecl_then [
710
685
‘fp_add_sub’,
711
- ‘st1’,
712
- ‘oracle’] mp_tac)
713
- \\ fs[isPureExp_def]
686
+ ‘st1’, ‘λ x . if x = 0 then [] else oracle (x-1 )’] mp_tac)
687
+ \\ impl_tac >- fp_inv_tac
714
688
\\ strip_tac
715
- \\ pop_assum (mp_then Any (qspec_then ‘st1.fp_state.choices’ assume_tac) (CONJUNCT1 evaluate_add_choices))
689
+ \\ ‘st2.fp_state.rws = st1.fp_state.rws’ by fp_inv_tac
690
+ \\ pop_assum (fs o single)
691
+ \\ pop_assum (mp_then Any mp_tac (CONJUNCT1 evaluate_add_choices))
692
+ \\ disch_then (qspec_then ‘st1.fp_state.choices’ assume_tac)
716
693
\\ qexists_tac ‘oracle'’ \\ qexists_tac ‘st1.fp_state.choices’
717
694
\\ simp[evaluate_def]
718
695
\\ simp[REVERSE_DEF, astTheory.getOpClass_def, astTheory.isFpBool_def,
719
696
Once evaluate_cons, evaluate_case_case]
720
- \\ fs (shift_fp_opts_def :: state_eqs)
721
- \\ ‘st1.fp_state.rws = st1N.fp_state.rws’ by fp_inv_tac
722
- \\ pop_assum (fs o single)
723
- \\ simp[do_app_def]
724
697
\\ fs state_eqs
698
+ \\ simp([do_app_def, shift_fp_opts_def] @ state_eqs)
699
+ \\ simp[Once do_fprw_def, rwAllWordTree_def]
700
+ \\ qpat_x_assum `evaluate _ _ [e2] = _` $ mp_then Any mp_tac (CONJUNCT1 evaluate_add_choices)
701
+ \\ disch_then $ qspec_then ‘st1.fp_state.choices + (st2.fp_state.choices - st1.fp_state.choices) + 1 ’ assume_tac
702
+ \\ gs state_eqs \\ pop_assum mp_tac
703
+ \\ qmatch_goalsub_abbrev_tac ‘evaluate st1Upd _ _ = _’ \\ rpt strip_tac
704
+ \\ qmatch_goalsub_abbrev_tac ‘evaluate st1New _ _’
705
+ \\ ‘st1Upd = st1New’ by (unabbrev_all_tac \\ gs (FUN_EQ_THM :: state_eqs))
706
+ \\ pop_assum $ gs o single
707
+ \\ gs (fp_translate_def :: state_eqs) \\ unabbrev_all_tac
725
708
\\ rpt conj_tac
726
709
>- fp_inv_tac
727
710
>- (fp_inv_tac \\ fs[FUN_EQ_THM])
728
711
>- fp_inv_tac
729
712
\\ qpat_x_assum `_ = Rval _` (fs o single o GSYM)
730
713
\\ simp[do_fprw_def, rwAllWordTree_def, nth_len]
731
- \\ simp[EVAL ``rwFp_pathWordTree fp_add_sub Here (fp_bop FP_Sub w1' w1 )``,
714
+ \\ simp[EVAL ``rwFp_pathWordTree ( fp_add_sub) Here (fp_bop FP_Add w1 (fp_uop FP_Neg w2) )``,
732
715
instWordTree_def, substLookup_def]
733
- \\ Cases_on `rwAllWordTree (st1N.fp_state.opts 0) st1N.fp_state.rws (fp_uop FP_Neg w1)`
734
- \\ fs[rwAllWordTree_def, fpValTreeTheory.fp_uop_def]
735
- >- (
736
- fs[do_fprw_def] \\ rveq
737
- \\ fs[fp_translate_def] \\ rveq
738
- \\ Cases_on ‘rwAllWordTree (st2N.fp_state.opts 0) st2N.fp_state.rws
739
- (fp_bop FP_Add w1' (Fp_uop FP_Neg w1))’
740
- \\ fs[rwAllWordTree_def, fpValTreeTheory.fp_bop_def]
741
- \\ imp_res_tac rwAllWordTree_append_opt
742
- \\ first_x_assum (qspec_then `[fp_add_sub]` assume_tac)
743
- \\ `st1N.fp_state.rws = st2N.fp_state.rws` by fp_inv_tac
744
- \\ fs[])
745
- \\ imp_res_tac rwAllWordTree_comp_right
746
- \\ first_x_assum (qspecl_then [‘w1'’, ‘FP_Add’] assume_tac)
747
- \\ first_x_assum (mp_then Any assume_tac rwAllWordTree_append_opt)
748
- \\ first_x_assum (qspec_then `[fp_add_sub]` assume_tac)
749
- \\ fs[do_fprw_def] \\ rveq
750
- \\ fs[fp_translate_def] \\ rveq
751
- \\ Cases_on ‘rwAllWordTree (st2N.fp_state.opts 0) st2N.fp_state.rws
752
- (fp_bop FP_Add w1' w2)’
716
+ \\ Cases_on `rwAllWordTree (st3.fp_state.opts 0 ) st3.fp_state.rws (fp_bop FP_Sub w1 w2)`
753
717
\\ fs[rwAllWordTree_def, fpValTreeTheory.fp_bop_def]
754
- \\ pop_assum (mp_then Any mp_tac rwAllWordTree_append_opt)
755
- \\ disch_then (qspec_then ‘[fp_add_sub]’ mp_tac)
756
- \\ `st1N.fp_state.rws = st2N.fp_state.rws` by fp_inv_tac
757
- \\ pop_assum (fs o single)
758
- \\ first_x_assum (mp_then Any assume_tac rwAllWordTree_chaining_exact)
759
- \\ disch_then (fn th => first_x_assum (fn ithm => mp_then Any assume_tac ithm th))
760
- \\ fs[] *)
718
+ \\ imp_res_tac rwAllWordTree_append_opt
719
+ \\ first_x_assum (qspec_then `[fp_add_sub]` assume_tac)
720
+ \\ `st3.fp_state.rws = st1.fp_state.rws` by fp_inv_tac
721
+ \\ fs[]
761
722
QED
762
723
763
724
Theorem fp_add_sub_correct_unfold =
0 commit comments