극성 주석
극성 주석 (Polarity Annotations)
Agda는 함수 인자와 데이터 타입 매개변수에 그들의 극성(polarity)을 명시적으로 주석으로 다는 것을 지원해요. 이는 양성 검사기가 양성을 추론하는 데 사용할 수 있는 모달리티 시스템(modality system)을 사용해요. 이 실험적 기능은 --polarity 옵션으로 활성화해야 해요. 다음은 타입 체크되는 다양한 주석의 샘플 사용 예시예요:
strictly-positive : @++ Set → Set
strictly-positive A = Nat → A
positive : @+ Set → Set
positive A = (A → Nat) → A
negative : @- Set → Set
negative A = A → Nat
mixed : @mixed Set → Set
mixed A = A → A
unused : @unused Set → Set
unused A = Nat
ex : @- Set → Set
ex A = negative (positive A)
ex2 : @mixed Set → Set
ex2 A = mixed (strictly-positive A)
ex3 : @++ Set → Set
ex3 A = unused (negative A)
다음 코드는 타입 체크되지 않아요:
ex3 : @++ Set → Set
ex3 A = mixed (strictly-positive A)
표준 용도는 임의의 엄격 양성 타입 형성자(type-former)의 고정점을 정의하는 것이에요 (이미 Agda에서 귀납 타입이 정의 가능하기 위한 기준이며, 엄격 양성을 참고하되, 극성 모달리티는 이 기준을 타입 시스템에 내면화해요):
data Mu (F : @++ Set → Set) : Set where
fix : F (Mu F) → Mu F
위 예에서 F가 자신의 인자를 엄격하게 양으로 사용하도록 지정되었기 때문에, 양성 검사기는 Mu F에 대한 재귀 호출이 엄격 양성 위치에 있다는 것을 알므로 생성자에 대한 인자로 F (Mu F)를 허용해요.
@++로 주석된 인자를 받는 함수를 정의할 때, 타이핑 규칙은 그 인자들이 화살표의 왼쪽에 실제로 나타날 수 없음을 보장해요. 다음 올바른 예처럼 인자를 사용하지 않는 함수에 대한 인자로 화살표 왼쪽에 구문적으로 나타날 수는 있어요:
const : @unused Set → Set
const _ = Nat
typechecks : @++ Set → Set
typechecks A = const A → Nat
극성 모달리티 (The polarity modality)
Agda는 모달 시스템을 사용해 극성 주석을 구현해요. 다음은 서로 다른 모달리티와 그 의미예요:
| 표기 | 이름 | 가능한 사용 |
|---|---|---|
@++ |
엄격 양성 (Strictly positive) | pi/함수 타입의 도메인을 제외한 어디든 |
@+ |
양성 (Positive) | pi/함수 타입의 중첩 도메인의 짝수 개수 안 |
@- |
음성 (Negative) | pi/함수 타입의 중첩 도메인의 홀수 개수 안 |
@mixed |
혼합 (Mixed) | 어디든 |
@unused |
미사용 (Unused) | 어디에도 없음 |
엄격 양성 타입은 예를 들어 [1]의 섹션 2.3에 설명된 구문적 조건이에요. (엄격 양성 없는) 매우 유사한 시스템이 [2]에 설명되었지만 모달리티 형식을 사용하지 않았어요.
Agda가 어떤 정의를 타입 체크할 때, 주석된 타입을 가진 람다 추상화로 바인딩된 변수들이 그 제한들을 만족하는지 보장해요. pi 타입의 코도메인을 검사할 때는 그러한 제한이 없다는 점에 주의하세요. 예를 들어 (@++ A : Set) → (A → A)는 완벽히 유효해요!
극성 주석은 함수 타입의 도메인과 데이터/레코드 타입 매개변수에만 나타날 수 있어요. 주석된 인자에 대한 패턴 매칭은 혼합 인자에 대해서만 지원돼요.
양성 검사 (Positivity checking)
Agda 양성 검사기는 타이핑 정보의 극성 주석을 사용해 분석을 강화하고 Mu 같은 타입을 받아들여요. 이는 양성 검사기가 그 정보 자체를 자동으로 추론하지 못할 때도 도움이 될 수 있어요. 다음은 주석 없이는 타입 체크되지 않는 조작된 예시예요:
apply-pattern-match : {A B : Set₁} → Nat → (@++ A → B) → @++ A → B
apply-pattern-match zero f = f
apply-pattern-match (suc n) f = f
id : {A : Set₁} → @++ A → A
id x = x
data D : Set where
node : (u : Nat) → apply-pattern-match u id D → D
참고 문헌 (References)
[1] Michael Abbott, Thorsten Altenkirch, Neil Ghani, "Containers: Constructing strictly positive types", In Theoretical Computer Science, Volume 342, Issue 1, 2005, https://doi.org/10.1016/j.tcs.2005.06.002
[2] Andreas Abel, "Polarized Subtyping for Sized Types", In: Mathematical Structures in Computer Science, 2006, https://doi.org/10.1007/11753728_39
[3] Josselin Poiret, Lucas Escot, Joris Ceulemans, Malin Altenmüller, and Andreas Nuyts. 2023. Read the Mode and Stay Positive. In 29th International Conference on Types for Proofs and Programs (TYPES), https://lirias.kuleuven.be/retrieve/720869