haskell - 将 Coq 提取到 Haskell
问题描述
我正在试验 Coq 对 Haskell 的提取机制。我在 Coq 中为素数写了一个简单的谓词,它是:
(***********)
(* IMPORTS *)
(***********)
Require Import Coq.Arith.PeanoNat.
(************)
(* helper'' *)
(************)
Fixpoint helper' (p m n : nat) : bool :=
match m,n with
| 0,_ => false
| 1,_ => false
| _,0 => false
| _,1 => false
| S m',S n' => (orb ((mult m n) =? p) (helper' p m' n))
end.
(**********)
(* helper *)
(**********)
Fixpoint helper (p m : nat) : bool :=
match m with
| 0 => false
| S m' => (orb ((mult m m) =? p) (orb (helper' p m' m) (helper p m')))
end.
(***********)
(* isPrime *)
(***********)
Fixpoint isPrime (p : nat) : bool :=
match p with
| 0 => false
| 1 => false
| S p' => (negb (helper p p'))
end.
Compute (isPrime 220).
(*****************)
(* isPrimeHelper *)
(*****************)
Extraction Language Haskell.
(*****************)
(* isPrimeHelper *)
(*****************)
Extraction "/home/oren/GIT/CoqIt/Primes.hs" isPrime helper helper'.
并且在提取 Haskell 代码后,我编写了一个简单的驱动程序来测试它。我遇到了两个问题:
- Coq 导出它自己的
Bool
而不是使用 Haskell 的内置布尔类型。 - Coq 也使用了它自己的
nat
,所以我不能问isPrime 6
,我必须使用S (S (...))
.
module Main( main ) where
import Primes
main = do
if ((isPrime (
Primes.S (
Primes.S (
Primes.S (
Primes.S (
Primes.S (
Primes.S ( O ))))))))
==
Primes.True)
then
print "Prime"
else
print "Non Prime"
解决方案
推荐阅读
- python - 使用 SQLAlchemy 文本构造原始批量插入语句
- google-apps-script - 从复选框中获取布尔值并将它们作为数字附加到另一个工作表中,例如数据库
- python - Python Argparser 使参数互斥
- r - R - 带有文本的数据框,在位置替换字符串
- google-sheets - 正则表达式从数组的单行中提取多个值
- maven - 使用 Maven Ant Task 将 jar 部署到 Nexus
- linux - Bash - 有没有办法在正在运行的屏幕上执行命令?
- ios - iOS如何删除同一对象上的多个观察者
- r - 如何将参与者编号更改为特定值?
- php - 使用 Facebook 登录在 Laravel 中不起作用