coq - 如何在 Coq 的函数式编程语言中执行 else 语句?
问题描述
我正在尝试计算Coqv
中 a中某个元素的出现次数。natlist/bag
我试过了:
Fixpoint count (v:nat) (s:bag) : nat :=
match s with
| nil => 0
| h :: tl => match h with
| v => 1 + (count v tl)
end
end.
但是我的证明不起作用:
Example test_count1: count 1 [1;2;3;1;4;1] = 3.
Proof. simpl. reflexivity. Qed.
为什么第一段代码不起作用?v
不匹配时它在做什么?
我也试过:
Fixpoint count (v:nat) (s:bag) : nat :=
match s with
| nil => 0
| h :: tl => match h with
| v => 1 + (count v tl)
| _ => count v tl
end
end.
但这也会在 Coq 中产生错误,我什至无法运行它。
函数式编程对我来说有点陌生,所以我不知道如何在 Coq 中实际表达这一点。我真的只想说如果h
匹配v
然后执行 +1 并递归,否则仅递归(即我猜加零)。
有没有一种简单的方法可以用 Coq 的函数式编程语言来表达这一点?
我问的原因是因为我觉得 match 的东西与“普通”Python 编程中的 if else 语句非常相似。所以要么我错过了函数式编程的重点或其他东西。这是我隐含地担心的主要问题。
解决方案
(这类似于丹尼尔的回答,但我已经写了大部分)
你的问题是在这段代码中:
match h with
| v => 1 + (count v tl)
end
匹配v
绑定一个新变量v
。要测试是否h
等于v
,您必须使用一些决策程序来测试自然数的相等性。
例如,您可以使用Nat.eqb
,它接受两个自然数并返回一个bool
指示它们是否相等的值。
Require Import Nat.
Fixpoint count (v:nat) (s:bag) : nat :=
match s with
| nil => 0
| h :: tl => if (eqb h v) then (1 + count v t1) else (count v t1)
end.
为什么我们不能简单地匹配我们想要的术语?模式匹配总是匹配该类型的构造函数。在这段代码中,外部匹配语句与nil
and匹配h :: t1
(这是一个符号cons h t1
或类似的东西,取决于 的精确定义bag
)。在匹配语句中
match n with
| 0 => (* something *)
| S n => (* something else *)
end.
我们匹配nat
:0
和S _
.
在您的原始代码中,您尝试匹配 on v
,它不是构造函数,因此 Coq 只需绑定一个新变量并调用它v
。
推荐阅读
- c - 计算和打印矩阵的对角线之和
- javascript - 如何在 Angular 中使用 addEventListener 和 postMessage?
- php - 如何将日期、时间和值从单选按钮放入数据库
- c# - 逐个像素地动态绘制和显示,有一些延迟
- npm - 如何从 Nexus oss 代理获取依赖于 github 项目的 npm 包
- django - Django 测试 - 发送包含整数的数组数组
- android - 在 android 中使用改造登录
- json - 我如何在 nunjuncks 中乘以数据?
- swift - 为什么不能在swift中将可变参数标记为inout?
- vue.js - Vue Js 2 / Vue-CLI 3 / 托管时显示空白页