定义一个返回满足条件的元素的函数

时间:2018-06-30 06:28:16

标签: coq

我想声明一个将元素(b,n)填充为 b 等于true的函数。

Require Export List.
Import Coq.Lists.List.ListNotations.

Definition lstest := list (bool * nat).


Fixpoint existbool (l : lstest) : option (bool * nat) :=
match l with
| [] => None
| (b, n) :: l' => if b then Some (b, n) else existbool l'
end.

该函数始终获得满足 b = true 的第一个元素。我想表示存在一个满足 b = true 的元素并返回该元素。我该如何定义这样的功能?

2 个答案:

答案 0 :(得分:0)

在下面的函数中,/var/lib/cassandra/data/twitter/tweets-a6da23906d8211e8a057ffb9a095df5c 的类型告诉您我们输出列表中包含的一对,其第一个元素为true(假设我们输出了existbool_ex)。

Some

答案 1 :(得分:0)

您可以编写函数get_number,该函数需要证明列表在某处具有true值。

Definition has_true (l : lstest):= exists n, In (true, n) l.

get_number是在refine的帮助下定义的,它使我们可以在证明项中留下“漏洞”(写成_),以便以后填写。这里有两个孔;一个用于列表为[]的荒谬情况,另一个用于构造递归调用的证明项。

Fixpoint get_number (l:lstest) (H: has_true l) : nat.
  refine (
      match l as l' return l' = _ -> nat with
      | (true, n)::_ => fun L => n
      | (false, _)::l' => fun L => get_number l' _
      | [] => fun L => _
      end eq_refl).

  now exfalso; subst l; inversion H.

  now subst l; inversion H; inversion H0;
    [congruence |  eexists; eauto].

Defined.

该函数使用 convoy模式,以便match语句不会忘记不同分支中l的形状。

如果愿意,可以证明重写引理以使其更易于使用。

Lemma get_number_false l m H: exists H', get_number ((false, m)::l) H = get_number l H'.
Proof. eexists; reflexivity. Qed.

Lemma get_number_true l m H: get_number ((true, m)::l) H = m.
Proof. reflexivity. Qed.

Lemma get_number_nil H m: get_number [] H <> m.
Proof.  now inversion H. Qed.

Lemma get_number_proof_irrel l H1 H2: get_number l H1 = get_number l H2.
Proof. induction l as [ | [[|] ?] l']; eauto; now inversion H1. Qed.