如何在Coq中添加相等的两边

时间:2016-05-03 05:38:49

标签: coq coq-tactic

这似乎是一个非常简单的问题,但我找不到任何有用的东西。

我有声明

n - x = n

并想证明

(n - x) + x = n + x

我无法找到定理允许的内容。

3 个答案:

答案 0 :(得分:2)

您应该查看rewrite策略(然后可能是reflexivity)。

编辑:有关重写的更多信息:

  • 您可以rewrite H rewrite -> H从左向右重写
  • 您可以rewrite <- H从右向左重写
  • 您可以使用pattern策略仅选择要重写的目标的特定实例。例如,要仅重写第二个n,您可以执行以下步骤

    模式n为2。 重写&lt; - H。

在您的情况下,解决方案更简单。

答案 1 :(得分:1)

建立在@ gallais&#39;关于使用f_equal的建议。我们从以下状态开始:

n : nat
x : nat
H : n - x = n
============================
 n - x + x = n + x

(1)第一个变种来自&#34;前进&#34;使用f_equal引理推理(其中一个将定理应用于假设)。

Check f_equal.
f_equal
 : forall (A B : Type) (f : A -> B) (x y : A), x = y -> f x = f y

它需要函数f,所以

apply f_equal with (f := fun t => t + x) in H.

这会给你:

H : n - x + x = n + x

这可以通过apply H.exact H.assumption.auto. ...或其他最适合您的方式解决。

(2)或者您可以使用&#34;向后&#34;推理(将定理应用于目标)。 还有f_equal2引理:

Check f_equal2.
f_equal2
 : forall (A1 A2 B : Type) (f : A1 -> A2 -> B) 
     (x1 y1 : A1) (x2 y2 : A2),
   x1 = y1 -> x2 = y2 -> f x1 x2 = f y1 y2

我们只是将其应用于目标,这会产生两个微不足道的子目标。

apply f_equal2. assumption. reflexivity.

或只是

apply f_equal2; trivial.

(3)还有更专业的引理f_equal2_plus

Check f_equal2_plus.
(*
f_equal2_plus
  : forall x1 y1 x2 y2 : nat,
    x1 = y1 -> x2 = y2 -> x1 + x2 = y1 + y2
*)

使用这个引理,我们可以通过以下单行解决目标:

apply (f_equal2_plus _ _ _ _ H eq_refl).

答案 2 :(得分:0)

Coq中有一个强大的搜索引擎使用模式。您可以尝试例如:

public  async void loadMoreData(int off)
        {
            var result= await json.GetStringbyJson("...offset=30);
            if (result != null) {
                items = Newtonsoft.Json.JsonConvert.DeserializeObject<TrackModel.RootObject> (result);
                foreach (var temp in items.tracks) {
                    //lst.Adapter=;
                }
                //lst.Adapter = new TrackAdapter (Activity, items.tracks);
            }
        }