Coq 如何处理右侧存在的函数?

Coq 如何处理右侧存在的函数?,coq,Coq,我不确定我是否在问题标题中使用了正确的词语,因此下面是代码: Lemma In_map_iff : forall (A B : Type) (f : A -> B) (l : list A) (y : B), In y (map f l) <-> exists x, f x = y /\ In x l. Proof. intros A B f l y. split. - intros. induction l. + intros.

我不确定我是否在问题标题中使用了正确的词语,因此下面是代码:

Lemma In_map_iff :
  forall (A B : Type) (f : A -> B) (l : list A) (y : B),
    In y (map f l) <->
    exists x, f x = y /\ In x l.
Proof.
  intros A B f l y.
  split.
  - intros.
    induction l.
    + intros. inversion H.
    + exists x.
      simpl.
      simpl in H.
      destruct H.
      * split.
        { apply H. } 
        { left. reflexivity. }
      * split.
基本上,这个证明没有太多的内容,我只能在l上使用归纳法,在目标中用x代替后,我得到上面的形式。如果IHl有一个forall而不是exists,也许我可以在那里替换一些东西,但我根本不知道在这里该做什么

我已经在这个问题上纠缠了一段时间了,但与其他已经发生的问题不同,我无法在网上找到这个问题的解决方案。这是一个问题,因为我正在自己翻阅这本书,所以除了在这样的地方,没有人可以问

请给我一些提示。多谢各位


我设法解决了一个问题,但现在陷入了另一个问题。老实说,既然我已经花了5个小时在一个需要15分钟的问题上,我开始觉得也许我应该在这一点上考虑基因编程。

h可以用两种不同的方式来实现,尝试破坏。但要注意你分解H和实例化存在的“你”的顺序。

这里有一个证明,它的结构与纸笔证明相同,至少在第一部分。当你看到。。。它意味着;直觉是因为直觉的证明。声明,即将直觉策略应用于生成的所有子目标。直觉使我们不必做繁琐的逻辑推理,它可以被一系列应用和重写策略所取代,利用一些逻辑引理

正如@ejgallego所指出的,这里的关键是,在证明的同时,你可以破坏存在假设,并从中获得某种类型的居民。在试图证明存在目标时,这一点至关重要

Require Import Coq.Lists.List.

Lemma some_SF_lemma :
  forall (A B : Type) (f : A -> B) (l : list A) (y : B),
    In y (map f l) <->
    exists x, f x = y /\ In x l.
Proof with intuition.
  intros A B f l y. split; intro H.
  - (* -> *)
    induction l as [ | h l'].
    + (* l = [] *)
      contradiction.
    + (* l = h :: l' *)
      destruct H.
      * exists h...
      * destruct (IHl' H) as [x H'].
        exists x...
  - (* <- *)
    admit.
Admitted.

这次我已经尽可能地更新了。我真的不知道国际人道主义法中的存在主义者应该做什么。试着从逻辑上思考存在主义证人的出处。事实上,如果你遵循纸笔证据的推理,你可能需要用在你的假设中摧毁其他存在论的证人来举例说明你的存在论。我确实设法通过了第一个案例,但我现在陷入了另一个。老实说,我需要一种更好的方法来解决这个问题,我甚至不太关心定理证明,也不知道如何非正式地证明这个问题——我只想弄清楚依赖类型的编程如何适用于像Idris和Fstar这样的语言,这些语言目前缺乏学习材料。我知道Coq的引擎盖下有自动化功能,但他们打印出来的东西非常难看。有人在这方面抛出了类似遗传算法的东西吗?@MarkoGrdinic除了为Idris和F*编写的官方教程外,你还可以在下面的书中找到更多。由E.Brady编写的一本很好的读物,以初学者为主。由于Idris和Agda a的a.Stump有点相似,因此它也可以免费购买。而A.Chlipala在Coq中展示了一些依赖类型的编程技术。@MarkoGrdinic噢!事实上,如果你想使用像Coq这样的工具,你应该先学会如何在纸上证明定理,否则,你就是在试图用锤子抓苍蝇。如果你真的想走自动定理证明的道路,我推荐Why3。即使有了Why3,你也需要理解为什么你的属性无法被证明,所以是的,就目前工具的现状而言,我敢说它们很难使用,除非你事先对软件验证有很好的理解。这看起来很不错。有没有办法让Coq打印出它所采取的确切步骤?像这样很难理解,因为在第二种情况下,它只是放大到终点线。根据我以前遇到的问题的经验,要么我没有正确地执行分解和泛化的顺序,要么我错过了一些明显的重写,因此我用手写出来的东西越少,出错的机会就越小。因此,尽可能地自动化应该是首选的风格。但我确实需要看看我是否要学习什么。我知道有命令,但我不知道如何使用它。在这方面的一些建议是受欢迎的。1从我的头顶上我只能在地图上打印出来。量化宽松之后。。这将打印出证明术语,并且通过一些经验,你将能够读出直觉使用的逻辑定律/引理。警告:这可能很难。2我已经添加了一些手动证明作为注释,以澄清什么可以。。。是的,我知道我错在哪里了。我曾尝试过自己破坏国际人道主义法,但错过了完成其中一个分支所需的两步重写,并认为这条大道是不可能的。以前不知道subst。为什么直觉需要标准库中的列表而不是我提供的列表?我必须导入列表,因为您没有发布您的定义。Di 你是以定点还是归纳的方式实施的?
Lemma In_map_iff :
  forall (A B : Type) (f : A -> B) (l : list A) (y : B),
    In y (map f l) <->
    exists x, f x = y /\ In x l.
Proof.
  intros A B f l y.
  split.
  - intros.
    induction l.
    + intros. inversion H.
    + simpl.
      simpl in H.
      destruct H.
      * exists x.
        split.
        { apply H. }
        { left. reflexivity. }
      * destruct IHl.
        -- apply H.
        -- exists x0.
           destruct H0.
           ++ split.
              ** apply H0.
              ** right. apply H1.
  - intros.
    inversion H.
    induction l.
    + intros.
      inversion H.
      inversion H1.
      inversion H3.
    + simpl.
      right.
      apply IHl.
      * inversion H.
        inversion H0.
        inversion H2.
        exists x.
        split.
        -- reflexivity.
        -- destruct H3.
  A : Type
  B : Type
  f : A -> B
  x0 : A
  l : list A
  y : B
  H : exists x : A, f x = y /\ In x (x0 :: l)
  x : A
  H0 : f x = y /\ In x (x0 :: l)
  IHl : (exists x : A, f x = y /\ In x l) ->
        f x = y /\ In x l -> In y (map f l)
  x1 : A
  H1 : f x1 = y /\ In x1 (x0 :: l)
  H2 : f x = y
  H3 : x0 = x
  H4 : f x = y
  ============================
  In x l
Require Import Coq.Lists.List.

Lemma some_SF_lemma :
  forall (A B : Type) (f : A -> B) (l : list A) (y : B),
    In y (map f l) <->
    exists x, f x = y /\ In x l.
Proof with intuition.
  intros A B f l y. split; intro H.
  - (* -> *)
    induction l as [ | h l'].
    + (* l = [] *)
      contradiction.
    + (* l = h :: l' *)
      destruct H.
      * exists h...
      * destruct (IHl' H) as [x H'].
        exists x...
  - (* <- *)
    admit.
Admitted.