首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell提取Coq

Haskell提取Coq
EN

Stack Overflow用户
提问于 2019-03-18 20:15:44
回答 2查看 1.1K关注 0票数 6

我在试验Coq的提取机制。我在Coq中为素数编写了一个简单的谓词,如下所示:

代码语言:javascript
复制
(***********)
(* 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代码之后,我编写了一个简单的驱动程序来测试它。我遇到了两个问题:

  1. Coq导出了自己的Bool,而不是使用内置于布尔类型的Haskell。
  2. Coq也使用了自己的nat,所以我不能问isPrime 6,我必须使用S (S (...))
代码语言:javascript
复制
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"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-18 21:09:36

关于你的第一点-尝试添加

代码语言:javascript
复制
Require Import ExtrHaskellBasic.

给你的Coq来源。它指定提取应该对一些基本类型使用Haskell的前奏定义。文档可以找到这里字符串也有类似的模块。

票数 8
EN

Stack Overflow用户

发布于 2019-03-19 08:31:27

我在这里发布了一个完整的解决方案,以使这篇文章自我包含。希望别人能利用它。

代码语言:javascript
复制
(***********)
(* 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).

(********************************)
(* Extraction Language: Haskell *)
(********************************)
Extraction Language Haskell.

(***************************)
(* Use Haskell basic types *)
(***************************)
Require Import ExtrHaskellBasic.

(****************************************)
(* Use Haskell support for Nat handling *)
(****************************************)
Require Import ExtrHaskellNatNum.
Extract Inductive Datatypes.nat => "Prelude.Integer" ["0" "succ"]
"(\fO fS n -> if n Prelude.== 0 then fO () else fS (n Prelude.- 1))".

(***************************)
(* Extract to Haskell file *)
(***************************)
Extraction "/home/oren/GIT/CoqIt/Primes.hs" isPrime helper helper'.  

这是司机:

代码语言:javascript
复制
module Main( main ) where

import Primes
import Prelude

main = do
    if ((isPrime 220) == True)
    then
        print "Prime"
    else
        print "Non Prime"

有趣的是,Coq的慢速Compute (isPrime 220)和Haskell的编译(和优化!)之间存在着巨大的时间差。超快版本的(is Prime 220)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55229385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档