gpt4 book ai didi

coq - 在 Coq 中计算列表中不同元素的数量

转载 作者:行者123 更新时间:2023-12-04 13:05:53 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数接受自然数列表并返回其中不同元素的数量作为输出。例如,如果我有列表 [1,2,2,4,1],我的函数 DifElem 应该输出“3”。我已经尝试了很多东西,我得到的最接近的是这个:

Fixpoint DifElem (l : list nat) : nat :=
match l with
| [] => 0
| m::tm =>
let n := listWidth tm in
if (~ In m tm) then S n else n
end.

我的逻辑是这样的:如果 m 不在列表的尾部,则向计数器加一。如果是,请不要添加到计数器中,所以我只会计算一次:当它是最后一次出现时。我收到错误:
Error: The term "~ In m tm" has type "Prop"
which is not a (co-)inductive type.

In 是 Coq 列表标准库的一部分 Coq.Lists.List.它在那里定义为:
Fixpoint In (a:A) (l:list A) : Prop :=
match l with
| [] => False
| b :: m => b = a \/ In a m
end.

我想我不太了解如何在定义中使用 If then 语句,Coq 的文档不够有用。

我也用 nodup 尝试了这个定义来自同一个图书馆:
Definition Width (A : list nat ) := length (nodup ( A ) ).

在这种情况下,我得到的错误是:
The term "A" has type "list nat" while it is expected to have
type "forall x y : ?A0, {x = y} + {x <> y}".

我对这里发生的事情感到很困惑。感谢您帮助解决此问题。

最佳答案

你似乎混淆了命题(Prop)和 bool 值(bool)。我将尝试用简单的术语来解释:命题是你要证明的东西(根据 Martin-Lof 的解释,它是一组证明), bool 值是一种只能容纳 2 个值的数据类型(true/false) ”)。当只有两种可能的结果并且不需要附加信息时, bool 值在计算中很有用。您可以在@Ptival 的this answer中找到有关此主题的更多信息,或者在 B.C.皮尔斯等人。 (参见Propositions and Booleans部分)。

实际上,nodup是这里的方法,但是 Coq 希望您提供一种方法来确定输入列表元素的相等性。如果你看一下 nodup 的定义:

Hypothesis decA: forall x y : A, {x = y} + {x <> y}.

Fixpoint nodup (l : list A) : list A :=
match l with
| [] => []
| x::xs => if in_dec decA x xs then nodup xs else x::(nodup xs)
end.

您会注意到一个假设 decA,它成为 nodup函数的附加参数,因此您需要传递 eq_nat_dec( nats的可判定相等性),例如,像这样: nodup eq_nat_dec l

所以,这是一个可能的解决方案:
Require Import Coq.Arith.Arith.
Require Import Coq.Lists.List.
Import ListNotations.

Definition count_uniques (l : list nat) : nat :=
length (nodup eq_nat_dec l).

Eval compute in count_uniques [1; 2; 2; 4; 1].
(* = 3 : nat *)

注意: nodup函数从 Coq v8.5 开始工作。

关于coq - 在 Coq 中计算列表中不同元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36774261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com