(初学者 Coq 问题)
与在产品类型上定义递归函数有关,我正在尝试在产品类型上定义递归函数。这里的区别是有一个相互递归的定义。我一直遇到这个错误:
printObjItem 的递归定义格式不正确。
对 printJson 的递归调用的主要参数等于“val”,而不是“item”的子项。
从概念上讲,递归应该经过,因为val是 的一个子项item,是 的一个子项items,是 的一个子项x。我了解 Coq 正在为第一个断言而苦苦挣扎,但我不确定如何解决。没有明确的有根据的证明,有没有直接的方法?
Require Import List.
Require Import String.
Import ListNotations.
Inductive Json :=
  | Atom : Json
  | String : string -> Json
  | Array : nat -> list Json -> Json
  | Object : list (string * Json) -> Json.
Fixpoint printJson (x : Json) :=
  match x with
  | Atom => "atom"
  | String n => "'" ++ n ++ "'"
  | Array _ els => "[" ++ (String.concat ", " (map printJson els)) ++ "]"
  | Object items => "{" ++ (String.concat ", " (map printObjItem items)) ++ "}"
  end%string
with printObjItem (item : string * Json) :=
       let (key, val) := item in key ++ ": " ++ (printJson val).