다음 Agda 정의를 인코딩할 수 있는 귀납적 체계는 무엇입니까?

cs.stackexchange https://cs.stackexchange.com/questions/120836

  •  29-09-2020
  •  | 
  •  

문제

어떤 유도 방식(예:Dybjer 및 Setzer의 유도-재귀, McBride의 "Irish" 유도-재귀 또는 Forsberg 및 Setzer의 유도-귀납 또는 아마도 더 간단한 것)을 사용하면 다음 Agda 정의를 인코딩할 수 있습니다.

  data A : Set where
    a : Maybe (List A) → A

재구성할 수 있는 몇 가지 트릭을 생각해 볼 수 있습니다. List 귀납-재귀가 적용 가능하도록 이 정의에서 먼저 목록이 무엇인지 말한 다음 이 정보를 참조하여 무엇인지 말할 수 있는 체계가 있습니까? A Agda에서는 그런 식으로 진행되나요?

편집하다:András Kovács의 답변에서 다음과 같이 특정한 정의는 귀납적 가족으로 재구성될 수 있다.수행 방법은 다음과 같습니다.

data Three : Set where one two three : Three

data AG : Three → Set where
  a'       : AG three → AG one
  nil'     : AG two
  cons'    : AG one → AG two → AG two
  nothing' : AG three
  just'    : AG two → AG three

A = AG one
ListA = AG two
MaybeListA = AG three

a : MaybeListA → A
a = a'

nil : ListA
nil = nil'

cons : A → ListA → ListA
cons = cons'

nothing : MaybeListA
nothing = nothing'

just : ListA → MaybeListA
just = just'
도움이 되었습니까?

해결책

내가 아는 어떤 체계도 해당 유형을 직접 인코딩하지 않습니다.때때로 그것은 "중첩된" 귀납적 정의라고 불립니다.여기서 복잡한 점은 Maybe 그리고 List 시그니처 외부에 있는 유형 생성자이며, 그러한 정의를 허용하려면 일반적으로 외부 유형 연산자에 대해 엄격한 긍정성을 공식화해야 합니다.

즉, 일관성은 A 정의에 따라 달라집니다. Maybe 그리고 List.다음과 같이 일부 외부 유형 연산자는 양수가 아닙니다.

data Neg (A : Set) : Set where
  neg : (A -> Bool) -> Neg A

data B : Set where
  b : Neg B -> B

Agda는 모든 외부 정의를 조사하고 유형 매개변수의 변화를 확인하려고 시도합니다.이에 대한 직접적인 공식 사양에 대한 참조는 모르지만 중첩된 정의를 중첩되지 않은 것으로 다시 공식화하는 쉬운 방법은 외부 유형 연산자를 상호 귀납적 서명에 포함시키는 것입니다.예를 들어:

data A : Set 
data ListA : Set
data MaybeListA : Set

data A where
  a : MaybeListA -> A

data ListA where
  nil : ListA
  cons : A -> ListA -> ListA

data MaybeListA where
  nothing : MaybeListA
  just : ListA -> MaybeListA

이것은 Dybjer의 유도 제품군에 의해 다루어지는(모듈로 외관 세부 사항) 일반적인 상호 유도 유형입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top