wro*_*yte 1 pattern-matching coq
我目前正在关注《软件基础》一书,目前正在阅读“列表”章节。 然而,我很难理解模式匹配的具体情况,并且由于是 Coq 的初学者,我不确定如何找到这个问题的答案。
因此,练习是创建一个来计算列表(更具体地说是一个包)中有Fixpoint多少 nat 。vs
我决定为此使用模式匹配,但如果我尝试定义这样的函数:
Fixpoint count' (v: nat) (s: bag) : nat :=
match s with
| nil => O
| h :: t => match h with
| v => S (count' v t)
end
end.
Run Code Online (Sandbox Code Playgroud)
并尝试将此功能应用于,比方说,
Example test_count1: count' 1 [1;2;3;1;4;1] = 3.
Run Code Online (Sandbox Code Playgroud)
我最终会得到6 = 3。我的理解是,匹配h始终v是“true”,因此它最终会计算列表中的每个元素。
但为什么会发生这种情况呢?h我们如何使用模式匹配来比较和的值v?
PS:我已经使用比较 ifh和vequal 的辅助函数解决了这个练习,但我想知道这是否只能使用内置模式匹配来实现。
图案
match h with
| v => S (count' v t)
end
Run Code Online (Sandbox Code Playgroud)
v引入了一个绑定到 的新变量h,遮盖了现有的v. 它相当于一个let表达式:
let v := h in S (count' v t)
(* or, without shadowing *)
let v1 := h in S (count' v1 t)
Run Code Online (Sandbox Code Playgroud)
相反,要比较h和v,请使用比较函数:
if h =? v then ... else ...
Run Code Online (Sandbox Code Playgroud)