JSON値の型定義
JSON仕様(RFC 8259)に基づく6つのプリミティブ型:
- null: ヌル値
- bool: 真偽値
- number: 数値(整数または浮動小数点)
- string: 文字列
- array: 値の順序付きリスト
- object: キー・値ペアの非順序集合
設計上の注意:
- numberは簡略化のためFloatで表現(実際のJSON仕様では任意精度)
- objectはList (String × JSONValue)で表現(重複キーは許容)
- null : JSONValue
- bool : Bool → JSONValue
- number : Float → JSONValue
- string : String → JSONValue
- array : List JSONValue → JSONValue
- object : List (String × JSONValue) → JSONValue
Instances For
Equations
- instReprJSONValue = { reprPrec := reprJSONValue✝ }
配列の長さを取得
Equations
- (JSONValue.array items).arrayLength = some items.length
- x✝.arrayLength = none
Instances For
オブジェクトのプロパティ数を取得
Equations
- (JSONValue.object props).objectSize = some props.length
- x✝.objectSize = none
Instances For
JSON値が指定された基本型かどうかを判定
Equations
- JSONValue.null.isType "null" = true
- (JSONValue.bool a).isType "boolean" = true
- (JSONValue.number a).isType "number" = true
- (JSONValue.number n).isType "integer" = JSONValue.numberIsInt n
- (JSONValue.string a).isType "string" = true
- (JSONValue.array a).isType "array" = true
- (JSONValue.object a).isType "object" = true
- x✝¹.isType x✝ = false
Instances For
JSON Pointer型(エラーパスの表現に使用)
Equations
Instances For
JSON Schema型(AMATELUSサブセット)
JSON Schemaは以下のいずれか:
- Boolean schema:
true(すべて受理) またはfalse(すべて拒否) - Object schema: キーワードのリストを含むオブジェクト
サブセットの特徴:
- $ref, $defs を含まない(循環参照を防止)
- additionalProperties を検証しない(プロトコルレベルで無視)
- if/then/else を含まない(oneOf で代替)
- boolSchema : Bool → Schema
- objectSchema : List SchemaKeyword → Schema
Instances For
スキーマキーワードの型(AMATELUSサブセット)
サポートされるキーワード:
- 型: type
- 文字列: maxLength, minLength, pattern
- 数値: maximum, minimum, multipleOf
- 配列: maxItems, minItems, uniqueItems, items
- オブジェクト: maxProperties, minProperties, required, properties
- 汎用: enum, const
- 組み合わせ: allOf, anyOf, oneOf, not (最大3レベル)
- アノテーション: title, description (検証に影響しない)
除外されたキーワード:
- $ref, $defs, $dynamicRef (参照系)
- additionalProperties, patternProperties (動的検証)
- if, then, else (条件分岐)
- format (フォーマット検証)
- その他のアノテーション (default, examples, deprecated, etc.)
- type : List String → SchemaKeyword
- maxLength : Nat → SchemaKeyword
- minLength : Nat → SchemaKeyword
- pattern : String → SchemaKeyword
- maximum : Float → SchemaKeyword
- minimum : Float → SchemaKeyword
- multipleOf : Float → SchemaKeyword
- maxItems : Nat → SchemaKeyword
- minItems : Nat → SchemaKeyword
- uniqueItems : Bool → SchemaKeyword
- items : Schema → SchemaKeyword
- maxProperties : Nat → SchemaKeyword
- minProperties : Nat → SchemaKeyword
- required : List String → SchemaKeyword
- properties : List (String × Schema) → SchemaKeyword
- enum : List JSONValue → SchemaKeyword
- const : JSONValue → SchemaKeyword
- allOf : List Schema → SchemaKeyword
- anyOf : List Schema → SchemaKeyword
- oneOf : List Schema → SchemaKeyword
- not : Schema → SchemaKeyword
- title : String → SchemaKeyword
- description : String → SchemaKeyword
Instances For
スキーマからtypeキーワードを取得
Equations
- (Schema.objectSchema keywords).getType = List.findSome? (fun (kw : SchemaKeyword) => match kw with | SchemaKeyword.type types => some types | x => none) keywords
- x✝.getType = none
Instances For
スキーマからrequiredキーワードを取得
Equations
- One or more equations did not get rendered due to their size.
- x✝.getRequired = []
Instances For
Equations
- instReprValidationError = { reprPrec := reprValidationError✝ }
Equations
- instReprValidationResult = { reprPrec := reprValidationResult✝ }
バリデーション結果が有効かどうか
Equations
Instances For
複数の結果を結合(すべて有効なら有効)
Equations
- One or more equations did not get rendered due to their size.
- ValidationResult.combineAll [] = ValidationResult.valid
- ValidationResult.combineAll (ValidationResult.valid :: rest) = ValidationResult.combineAll rest
Instances For
複数の結果のうち少なくとも1つが有効なら有効
Equations
- One or more equations did not get rendered due to their size.
- ValidationResult.combineAny [] = ValidationResult.invalid [{ message := "No schemas to validate against", path := "", keyword := "anyOf" }]
Instances For
複数の結果のうちちょうど1つが有効なら有効
Equations
- One or more equations did not get rendered due to their size.
- ValidationResult.combineOne [] = ValidationResult.invalid [{ message := "No schemas to validate against", path := "", keyword := "oneOf" }]
Instances For
正規表現パターン型
Equations
Instances For
マッチ成功した文字列
正規表現パターンにマッチした文字列を表す型。 型レベルで正規性を保証し、UnknownVCと同様の設計パターンを使用。
設計:
- 実際の正規表現エンジン(ECMA-262)は外部実装に依存
- プロトコルレベルではマッチ成功を抽象化
- Issuer/Validatorが正しい実装を使用することを前提
- value : String
- pattern : RegexPattern
Instances For
Equations
- instReprMatchedString = { reprPrec := reprMatchedString✝ }
マッチ失敗した文字列
正規表現パターンにマッチしなかった文字列を表す型。
設計:
- 型レベルでマッチ失敗を表現
- 実装の詳細は抽象化
- value : String
- pattern : RegexPattern
- reason : String
Instances For
Equations
- instReprUnmatchedString = { reprPrec := reprUnmatchedString✝ }
未検証のマッチ結果
正規表現マッチングの結果を表す和型。 ValidVC/InvalidVCと同様の設計パターン。
命名の意図:
- 「UnknownMatchResult」= 構造的には存在するが、マッチ状態は未確定または既知
- マッチ成功/失敗のいずれかを型レベルで表現
設計の利点:
- 正規表現エンジンの実装詳細を抽象化
- プロトコルレベルでは「マッチ/非マッチ」の区別のみが重要
- 実装バグは
unmatchedとして表現され、プロトコルの安全性には影響しない
- matched : MatchedString → UnknownMatchResult
- unmatched : UnmatchedString → UnknownMatchResult
Instances For
Equations
- instReprUnknownMatchResult = { reprPrec := reprUnknownMatchResult✝ }
マッチ検証関数(定義として実装)
設計の核心:
- マッチ成功(matched): 常に検証成功
- マッチ失敗(unmatched): 常に検証失敗
この単純な定義により、正規表現エンジンの詳細を抽象化しつつ、 プロトコルの安全性を形式的に証明できる。
Equations
Instances For
Theorem: マッチ成功した文字列は常に検証成功
正規表現にマッチした文字列は、検証が成功する。 これは定義から自明だが、明示的に定理として示す。
Theorem: マッチ失敗した文字列は常に検証失敗
正規表現にマッチしなかった文字列は、検証が失敗する。
スキーマに対して有効な JSON 値
型レベルでバリデーション成功を保証。 実際の検証ロジックは実装側(Rust/TypeScript等)で行われる。
設計:
- ValidVC と同じパターン
- 型自体が「検証済み」を表現
- プロトコルレベルでは抽象化
Instances For
スキーマに対して無効な JSON 値
型レベルでバリデーション失敗を保証。 実装側のバリデーターがエラーを検出した場合に使用される。
設計:
- InvalidVC と同じパターン
- エラー情報を含む(デバッグ用)
- value : JSONValue
- schema : Schema
- errors : List ValidationError
Instances For
未検証のバリデーション結果
構造的にはJSON値とスキーマのペアだが、バリデーション結果を表す和型。 ValidVC/InvalidVCと同様の設計パターン。
命名の意図:
- 「UnknownValidation」= 構造的には存在するが、バリデーション状態は未確定または既知
- valid/invalid のいずれかを型レベルで表現
設計の利点:
- バリデーションロジックの実装詳細を抽象化
- プロトコルレベルでは「valid/invalid」の区別のみが重要
- 実装バグは
invalidとして表現され、プロトコルの安全性には影響しない
- valid : ValidJSONValue → UnknownValidation
- invalid : InvalidJSONValue → UnknownValidation
Instances For
バリデーション検証関数(定義として実装)
設計の核心:
- 有効なJSON値(valid): 常に検証成功
- 無効なJSON値(invalid): 常に検証失敗
この単純な定義により、バリデーションロジックの詳細を抽象化しつつ、 プロトコルの安全性を形式的に証明できる。
実装の責任:
- 実装側(Rust/TypeScript)が実際のバリデーションを行う
- Lean側は型と性質のみを定義
Equations
Instances For
Theorem: 有効なJSON値は常に検証成功
型レベルで有効と判定されたJSON値は、検証が成功する。 これは定義から自明だが、明示的に定理として示す。
Theorem: 無効なJSON値は常に検証失敗
型レベルで無効と判定されたJSON値は、検証が失敗する。
Theorem: Boolean schema true はすべての値を受理
Boolean schema true に対しては、任意のJSON値が有効。
Theorem: Boolean schema false はすべての値を拒否
Boolean schema false に対しては、任意のJSON値が無効。
正規のスキーマ(AMATELUSサブセット)
構文的に正しく、バリデーションに使用できるスキーマ。
制約:
- required配列の要素は一意
- enum配列は空でない
- 数値制約は有効な範囲
- composition keywordsのネスト深さは最大3レベル
- $ref, $defs を含まない
- schema : Schema
Instances For
不正なスキーマ
構文的に誤っているか、矛盾を含むスキーマ。
Instances For
未検証のスキーマ
パースされたが、正規性が未確定のスキーマ。
- valid : ValidSchema → UnknownSchema
- invalid : InvalidSchema → UnknownSchema
Instances For
スキーマの構文検証
検証内容:
- required配列の一意性
- enum配列の非空性
- 数値制約の妥当性
- composition nesting depth ≤ 3
簡略化: 実装では常にtrueを返す(実際の検証は省略)
Equations
Instances For
未検証スキーマから正規スキーマへの変換
Equations
Instances For
例: 単純な文字列スキーマ
Equations
Instances For
例: オブジェクトスキーマ(Person)
Equations
- One or more equations did not get rendered due to their size.
Instances For
例: 配列スキーマ
Equations
- One or more equations did not get rendered due to their size.
Instances For
例: enum制約
Equations
- Examples.colorEnumSchema = Schema.objectSchema [SchemaKeyword.type ["string"], SchemaKeyword.enum [JSONValue.string "red", JSONValue.string "green", JSONValue.string "blue"]]
Instances For
例: allOf 組み合わせ
Equations
- One or more equations did not get rendered due to their size.
Instances For
例: oneOf 組み合わせ(識別された和型)
Equations
- One or more equations did not get rendered due to their size.