我想声明一个将元素(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 的元素并返回该元素。我该如何定义这样的功能?
答案 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.