유도 성 유형의 정의에서 "가드 (guarded)"부정적인 발생, 항상 나쁜가?


11

일부 부정적인 사건이 어떻게 결정적으로 나쁠 수 있는지 알고 있습니다.

data False

data Bad a = C (Bad a -> a)

selfApp :: Bad a -> a
selfApp (x@(C x')) = x' x

yc :: (a -> a) -> a
yc f = selfApp $ C (\x -> f (selfApp x))

false :: False
false = yc id

그러나 나는 확실하지 않다.

  • 부정적인 발생을 갖는 모든 유도 유형은 잘못 될 수 있습니다.

  • 그렇다면 알려진 기계적 방법이 있습니다.

예를 들어, 나는이 유형을 잘못 만들기 위해 싸우고 있습니다.

type Not a = a -> False

data Bad2 a = C2 (Bad2 (Not a) -> a)

이 주제에 관한 문헌에 대한 모든 조언을 부탁드립니다.


1
이거요? 하스켈? 의사 형 이론? "잘못된다"는 것은 무엇을 의미합니까?
Dave Clarke

@DaveClarke 죄송합니다. 코드는 Haskell이지만, 부정적 발생이 금지 된 Coq 또는 Agda와 같은 언어에 대한 우려가 있습니다. "잘못된다"는 말은 발산하는 용어를 쓸 수있어서 하스켈에서의 예에서와 같이 거짓으로 살 수 있음을 의미합니다.
Ptival

답변:


10

부정적인 발생을 금지하는 이유는 Knaster-Tarski 정리와 유사하게 이해할 수 있습니다. 이 정리는

만약 전체 격자이고 의 단조 함수이고 다음의 고정 점의 집합 또한 완전한 격자이다. 특히, 고정 소수점 와 최대 고정 소수점 있습니다.f : L L L f μ f ν fLf:LLLfμfνf

전통적인 모델 이론에서, 격자 ( 는 명제로 간주 될 수 있으며, 순서 관계 는 로 이해 될 수있다 (즉, 의 진실은 의 진실에 의해 수반 됨 ).p q q pLpqqp

모델 이론에서 증명 이론으로 이동할 때, 격자는 범주로 일반화됩니다. 분류는 분류의 대상으로 볼 수 , 및지도 나타내는 증거 것을 로부터 유도 될 수 . e : P Q Q QCe:PQQQ

재귀 방정식, ee, 의해 정의 된 유형을 해석하려고 할 때 Knaster-Tarski 정리의 일반화를 찾아야합니다. 따라서 격자의 모노톤 함수 대신 객체를 객체로 보내는 functor 하지만 모든 맵 되도록 단 조성 조건을 일반화해야 는 맵 얻습니다 는 일관성 조건을 사용하여 는 ID를 ID로 보내고 컴포지션을 보존하므로 ).F : CC E : P Q F ( E ) : F ( P ) F ( Q ) F F ( g F ) = F ( g ) F ( F )N=μα.1+α F:CCe:PQF(e):F(P)F(Q)FF(gf)=F(g)F(f)

따라서 유도 데이터 유형 를 원하면 원하는 고정 점이 존재 하도록 유형 연산자 에 대한 함수에 대한 함수를 제공해야 합니다. Agda와 Coq의 엄격한 양성 조건은 이러한 의미 적 제약 을 암시 하는 구문 적 조건입니다 . 느슨하게 말해서, 합계와 제품에서 유형 연산자를 작성하면 항상 functorial 조치를 요리 할 수 ​​있으므로이 방법으로 형성된 모든 유형에는 고정 점이 있어야합니다.μα.F(α)F

종속 유형 언어에서는 인덱스 및 매개 변수 유형도 있으므로 실제 작업이 더 복잡합니다. Bob Atkey ( 여기여기 에서 블로그를 작성한 사람 )는 스토리를 찾기에 좋은 곳은 다음과 같습니다.

Andrej가 지적한 것처럼 기본적으로 부정적인 발생이 올바른지 아닌지는 유형 이론의 모델에 따라 다릅니다. 기본적으로 재귀 정의가 있으면 고정 소수점을 찾고 수학에 많은 고정 소수점 정리가 있습니다.

제가 개인적으로 많이 사용하는 것은 Banach의 고정 소수점 정리입니다. 이는 미터법 공간에서 엄격하게 수축적인 기능을 수행하면 고유 한 고정 소수점이 있다고 말합니다. 이 아이디어는 (IIRC) Maurice Nivat에 의해 시맨틱에 도입되었고, 미국과 Rutten에 의해 광범위하게 연구되었으며, 최근 Birkedal과 그의 협력자들은 "단계 색인"이라는 대중적인 운영 기술에 연결되었습니다.

이로 인해 재귀 적 유형에서 부정적 발생이 허용되는 유형 이론이 발생하지만, 특수한 "guardedness"유형 생성자에서 부정적 발생이 발생하는 경우에만 가능합니다. 이 아이디어는 Hiroshi Nakano에 의해 소개되었으며, Banach의 정리와의 연결은 Lars Birkedal과 그의 공동 저자뿐만 아니라 Nick Benton과 나 자신에 의해 이루어졌습니다.


7

때때로 당신은 "운에 의해"재귀 방정식을 풀 수 있습니다.

나는 당신이 (도메인 이론과는 달리) 세트로 이것을하고 싶다고 가정합니다. 우리가 정의를 풀고 Haskell 주석없이 직접 방정식을 쓰면 두 가지 경우를 고려해 보겠습니다.

A(A)A.
  1. 가 거주하는 경우 , 즉 무언가를 포함하면 이므로 방정식은 줄어 듭니다 실제로 싱글 톤 세트 은 방정식을 해결합니다.AA

    AA1.
    1
  2. 가 비어 있으면 입니다.A()1

결론 : 빈 유형 (당신이 불렀던 False)과 단위 유형의 두 가지 해결책이 있습니다 ().

흥미로운 또 다른 예가 있습니다 : 또는 Haskell

A(A2)2,
data Cow a = Moo ((a -> Bool) -> Bool)

세트의 관점에서 이것은 입니다. 는 보다 적은 요소를 가지기 때문에 Cantor의 정리에 따르면 해가 없습니다 . 그러나 위상 공간에서이 방정식을 보면 이라는 해결책이 이것은 이 Cantor 공간이고, 이 clopen 부분 집합의 공간이기 때문에 많은 수가 있습니다 (그리고 당신은 그들은 별개의 공간을 형성합니다). 마찬가지로, Haskell 사이 와 Haskell 사이 에서 이의 를 표시 할 수 있습니다 .A22AA22A

N22N.
2N22NInteger(Integer -> Bool) -> Bool

3

Andrej 또는 Neel의 설명에 무엇이든 추가하기는 어렵지만 한 번하겠습니다. 나는 설명이 더 기본적이고 내 질문에 대한 더 직접적인 대답을 제공하기 때문에 기본 의미를 발견하려고 시도하는 대신 구문 관점을 다루려고 노력할 것입니다.

저는 Haskell의보다 복잡한 시스템이 아닌 단순 형식의 -calculus 에서 작업 할 것 입니다. 특히 유형 변수가 있으면 어느 정도 혼란 스러울 수 있다고 생각합니다.λ

중요한 참조는 다음과 같습니다.

Mendler, N. (1991). 2 차 람다 미적분에서의 유도 유형 및 유형 제약. 온라인에서 참조를 찾지 못했습니다. 그러나이 진술과 증거는 Nax의 박사 학위 논문 ( 강제 권장 사항!) 에서 찾을 수 있습니다 .

멘 들러는 양성은 비재 귀적 사례 정의 (그리고 구조적으로 감소하는 재귀 적 사례)가 존재하는 경우 종결을 위해 필요 하고 충분한 조건 이라고 설명했다 . 그는 방정식 공식을 사용하여 설명합니다 . 간단한 예를 이는 형식을 단순화 한 것 입니다.Bad

Bad=BadA

여기서 는 모든 유형입니다. 우리는 다음A

λx:Bad.x x:BadA

그래서

(λx:Bad.x x) (λx:Bad.x x):A

이것에 대해 수행 될 수 있다는 멘 도시 어떤 유형 여기서, 적어도 하나 개의 음의 발생이있는 타입 (물론 양극 발생이있을 수있다) . 그는 주어진 (논문 39-40 페이지 대해 끝나지 않는 명확한 용어를 제공합니다 .

Bad=F(Bad)
F(X)XF(X)

물론 방정식으로 정의 된 유형이 아니라 생성자 로 작업하고 있습니다.

data Bad = Pack (Bad -> A)

엄격한 평등보다는 그러나 당신은 정의 할 수 있습니다

unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f

이 결과를 계속 유지하기에 충분합니다.

 (\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))

이 용어는 여전히 유형 의 유형 입니다.A


두 번째 예에서는 라인을 따라 무언가가 있기 때문에 상황이 조금 더 까다로워집니다.

Bad=BadA

여기서 되어 관련 ,하지만 하지 에, 동일 가 동일하다 귀하의 경우 ( 와 ). 나는 둘 사이에 간단한 동 형사상을 만들 수 없다는 것을 인정할 것이다. 교체해도 동일한 문제가 발생합니다B a d B a d a B a d ( N o t a)BadBadBad aBad (Not a)

type Not a = a -> False

data Not a = Not a

Haskell이 이러한 유형 정의를 허용하면 쉽게 해결할 수 있습니다.

type Acc = Not Acc

이 경우 이전과 정확히 동일한 방식으로 루핑 결합기를 만들 수 있습니다. 나는 당신이 비슷한 (그러나 더 복잡한) 구성을 사용할 수 있다고 생각합니다.

data Acc = D (Not Acc)

여기서 문제는 동 형사상을 만드는 것입니다

Bad Acc <-> Bad (Not Acc)

혼합 분산을 다루어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.