Coq 不使用辅助函数的定义函数

Coq 不使用辅助函数的定义函数,coq,Coq,我一直在阅读《软件基础》并解决其中的问题。这是我试图定义的定义之一: Fixpoint split {X Y : Type} (l : list (X*Y)) : (list X) * (list Y) 基本上,它是haskell的解压版 我是这样实现的: Fixpoint split2 {X Y : Type} (l : list (X*Y)) (g :(list X) * (list Y)) : (list X) * (list Y) := match l

我一直在阅读《软件基础》并解决其中的问题。这是我试图定义的定义之一:

Fixpoint split {X Y : Type} (l : list (X*Y)) : (list X) * (list Y)
基本上,它是haskell的
解压版

我是这样实现的:

Fixpoint split2 {X Y : Type} (l : list (X*Y)) (g :(list X) * (list Y))
               : (list X) * (list Y) :=
  match l with
    | [] => g
    | (x,y)::xs => split2 xs ((fst g) ++ [x],(snd g) ++ [y])
  end.

Fixpoint split {X Y : Type} (l : list (X*Y))
               : (list X) * (list Y) :=
split2 l ([],[]).
我有两个问题:

  • 是否可以定义
    split
    ,而不使用像
    split2
    这样的辅助函数
  • Coq中是否有与where子句(如Haskell中)等价的语句

    • Coq中有
      let
      。您可以而且应该只翻译标准的Haskell定义,避免使用
      ++
      :

      Fixpoint split {A B} (l : list (A * B)) : list A * list B :=
        match l with
          [] => ([], [])
        | (x, y) :: xs => let (xs2, ys2) := split xs in (x::xs2, y::ys2)
        end.