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
。我认为没有必要进行反转
(在大多数情况下可能最好避免),尤其是在这里,因为一个简单的析构函数
就足以检查这两种情况。