gpt4 book ai didi

haskell - 将 Coq 提取到 Haskell

转载 作者:行者123 更新时间:2023-12-04 14:22:15 28 4
gpt4 key购买 nike

我正在试验 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 的内置 bool 类型。
  • 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"

    最佳答案

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

    Require Import ExtrHaskellBasic.

    到你的 Coq 源。它指定提取应该使用 Haskell 的一些基本类型的前奏定义。可以找到文档 here . strings 也有类似的模块.

    关于haskell - 将 Coq 提取到 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229385/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com