为什么跟随Coq重写不适用于假设的右侧?

时间:2017-09-02 17:37:13

标签: coq

我有以下Coq env。

    1 subgoals
m : nat
IHm : forall n : nat, n + n = m + m -> n = m
n : nat
H : S (n + S n) = S (m + S m)
ll := ll : forall k : nat, k + S k = S k + k

执行rewrite ll in H,只会将LHS S (n + S n)更改为S (S n + n),而不会将RHS S (m + S m)更改为ll** job_titles_table ** ** misspelled_words_table ** job_title_id job_title job_title_id misspelled_word correct_spelling 15802 animation dept superviser 15802 animation Animation 15803 animator / character key assistant 15802 dept Department 15804 Lead 2D Animator 15802 superviser Supervisor 15805 Character Technical Director 15803 animator Animator 15806 character layout apprentice 15803 assistant Assistant 15807 Production Coordinator 15803 key Key 15808 lighting and render engineer 15806 apprentice Apprentice 15806 layout Layout 15808 engineer Engineer 15808 lighting Lighting 15808 render Render 应适用于nat类型的所有变量。这有什么不对?

1 个答案:

答案 0 :(得分:2)

扩展Emilio的评论,rewrite Hrewrite H in H'将首先找到H的所有(依赖)量化变量的实例化,然后替换所有出现的Goal forall a b, (forall x, x + 0 = x) -> (a + 0) * (a + 0) * (b + 0) = a * a * b. intros a b H. rewrite H. 用RHS实例化LHS。我相信它在语法树中找到最顶层/最左边的实例。所以,例如,如果你这样做:

rewrite H

x将选择使用a实例化a * a * (b + 0) = a * a * b,结果目标为!。您可以使用rewrite !H(如?)为引理添加前缀,以表示"在任何地方重写,尽可能多地选择实例化#34;或使用rewrite ?H(如try rewrite !H)表示rewrite H,即您可以选择多个实例,如果找不到任何实例,也不会失败。

*实际上有一点点细微差别,即替换是在rewrite ?H的单次传递中完成的,并且在rewrite !Ha + 0 = a的多次传递中完成。这仅在第一个替换件暴露其他先前不可用的替换位置时显示。例如,如果您在目标(a + 0) + 0 = a中使用rewrite H重写,则会显示此信息。 a + 0 = 0离开目标<ScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="match_parent">