如何在Coq语句中证明给定集合

如何在Coq语句中证明给定集合,coq,dependent-type,induction,Coq,Dependent Type,Induction,在COQ中,如何证明下面这样的陈述 需要导入向量。 导入矢量符号。 需要进口Fin。 定义v:=[1;2;3;4;5;6;7;8]。 引理L:forall(x:Fin.t8),(n次vx)>0。 或者,假设你有一个给定的数字列表,你想证明没有数字在这个列表中出现两次 也许有人必须编写一个以引理为类型的算法。但我不知道怎么做 顺便说一句,这不是家庭作业 这里有一个快速而肮脏的证明: Proof. Require Import Program. dependent destruction x. a

在COQ中,如何证明下面这样的陈述

需要导入向量。
导入矢量符号。
需要进口Fin。
定义v:=[1;2;3;4;5;6;7;8]。
引理L:forall(x:Fin.t8),(n次vx)>0。
或者,假设你有一个给定的数字列表,你想证明没有数字在这个列表中出现两次

也许有人必须编写一个以引理为类型的算法。但我不知道怎么做


顺便说一句,这不是家庭作业

这里有一个快速而肮脏的证明:

Proof.
Require Import Program.
dependent destruction x.
auto.
dependent destruction x.
compute.
auto.
dependent destruction x.
compute.
auto.
dependent destruction x.
compute.
auto.
dependent destruction x.
compute.
auto.
dependent destruction x.
compute.
auto 10.
dependent destruction x.
compute.
auto 10.
dependent destruction x.
compute.
auto 10.
dependent destruction x.
Qed.

我们使用
程序
模块中的
依赖销毁
策略。这依赖于JMeq公理,但这不应该是一个问题。

让我建议使用math comp库的解决方案:

From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq.
From mathcomp Require Import fintype tuple.

Definition v := [tuple of [:: 1;2;3;4;5;6;7;8]].

Lemma L : forall x, tnth v x > 0.
Proof. exact/all_tnthP. Qed.

all\u tnthP
引理将用它的可计算版本替换谓词,从而使Coq检查元组中的所有元素都大于0,从而得出证明。

这很容易证明(用Coq或手工),因为它只是一个特定的列表。你的最终目标是证明由其他东西生成的列表的内容吗?在这种情况下,您需要证明生成列表的代码/函数/过程。这就是有趣的地方。如果列表变得复杂,“手工”证明是不可能的。例如,考虑一个COQ模型,它需要一个大的1000x1000矩阵作为参数。必须确保矩阵具有满秩。假设您需要满秩属性来证明模型的属性。当然,人们可以用计算机代数系统检查模型的每个实例,并将“满秩”属性作为公理添加到模型中。但这有点奇怪……我认为问题在于COQ对依赖类型的归纳有一些限制。该网站试图解释它,但我很难理解他们的论点。你可以使用
repeat
将其缩小到
repeat-dependent-x;计算;自动10。