Functional programming 映射函数的逻辑Coq证明

Functional programming 映射函数的逻辑Coq证明,functional-programming,logic,coq,proof,Functional Programming,Logic,Coq,Proof,我试图证明以下引理: 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. forall(ab:Type)(f:A->B)(l:list A)(y:B), y方向(地图f l) 存在x,f x=y/\In x l。 我先分裂来处理第一个方向,然后在l上做归纳,这样基本情况就容易了。但过了这一关,我就被卡住了。

我试图证明以下引理:

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.
forall(ab:Type)(f:A->B)(l:list A)(y:B),
y方向(地图f l)
存在x,f x=y/\In x l。

我先分裂来处理第一个方向,然后在l上做归纳,这样基本情况就容易了。但过了这一关,我就被卡住了。我认为这与存在x有关,而且无论我在哪里尝试引入x,我都无法让x与x0对齐。救命啊

我不理解您关于
x0
的问题,如果这是关于Coq自动将
x
重命名为
x0

如果我要实现你的目标,我会按如下方式实现:

Goal 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.
  - intro h. induction l as [| a l ih].
    + contradict h.
    + simpl in h. destruct h as [h | h].
      * exists a. split.
        -- assumption.
        -- left. reflexivity.
      * specialize (ih h). destruct ih as [x [e i]].
        exists x. split.
        -- assumption.
        -- right. assumption.
所有目标(A B:类型)(f:A->B)(l:列表A)(y:B),
y方向(地图f l)
存在x,f x=y/\In x l。
证明。
介绍A B f l y。分裂
-介绍h。归纳法l as[| a l ih]。
+反驳h。
+h中的simple。将h分解为[h | h]。
*存在a。分裂
--假设。
--左。自反性。
*专攻(IHH)。将ih分解为[x[ei]]。
存在x。分裂
--假设。
--对。假设。
也许你想把归纳假设和直接应用它的目标联系起来?
不幸的是,我认为你必须像我一样,首先将归纳假设分解成一个
x
及其属性,然后重新构建目标,在
l
归纳l的尾部;一级;subst;建造师;自反性。
关于你的问题;要处理第二种情况,您知道
在y中(map f(a::l))
这实际上是两种情况-
y
在列表的开头或结尾。对这一事实进行倒置,以便根据这一信息进行拆分。然后很容易看出,请求的
x
是在反转后弹出的
a
。我认为没有必要进行
反转
(在大多数情况下可能最好避免),尤其是在这里,因为一个简单的
析构函数
就足以检查这两种情况。