gpt4 book ai didi

coq - 产品类型上的相互递归函数

转载 作者:行者123 更新时间:2023-12-04 10:56:13 25 4
gpt4 key购买 nike

(初学者 Coq 问题)
相关 Defining recursive function over product type ,我试图在产品类型上定义递归函数。这里的区别在于有一个相互递归的定义。我一直遇到这个错误:

Recursive definition of printObjItem is ill-formed.

Recursive call to printJson has principal argument equal to "val" instead ofa subterm of "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).

最佳答案

一种解决方案是制作 printObjItem本地定义:

Fixpoint printJson (x : Json) :=
let printObjItem (item : string * Json) :=
(let (key, val) := item in key ++ ": " ++ (printJson val))%string
in
match x with
| Atom => "atom"
| String n => "'" ++ n ++ "'"
| Array _ els => "[" ++ (String.concat ", " (map printJson els)) ++ "]"
| Object items => "{" ++ (String.concat ", " (map printObjItem items)) ++ "}"
end%string.

关于coq - 产品类型上的相互递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171693/

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