함수 인자 quantifier를 생략하거나 중괄호로 감싸면 묵시적으로 적용됨.
표준 라이브러리에서 가져온 데이터 정의
data Nat = Z | S Nat
data (=) : a -> b -> Type where
Refl : a=a
= 타입은 두 값이 같은걸 표현함.
sym : x=y -> y=x
trans : x=y -> y=z -> x=z
cong : x=y -> f x = f y
이 함수들로 간단히 다룰 수 있음.
근데 이걸로 좀 부족해서
trans2 : x=y -> x=x' -> y=y' -> x'=y' 을 정의함.
이름이 적합한지는 잘 모르겠다
덧셈도 표준 라이브러리에 정의되있음
Z+n = n
(S m)+n = S (m+n)
addZl : Z가 좌항등원
addZr: Z가 우항등원
resolvel
resolver : 뭐라 부를지 모르겠는데, 그냥 S랑 +순서 바꾸는거
resolve2: 1+(1+(m+n)) = (m+1)+(n+1)
commute0 : 0,n 교환법칙
commute : 덧셈 교환법칙
associate : 덧셈 결합법칙
일단 이런 느낌인데, 구현은 설명할 자신이 없네
나도 아직 헷갈려서ㅋㅋㅋ
Refl는 뭔데
equivalence type을 리플렉션으로 정의한거
https://en.wikipedia.org/wiki/Equivalence_class
아 미안 Refl 타입 잘못 씀. Refl : a=a 가 맞음
addZl 만 설명해보면, 컴파일러가 Z+n을 평가해서 (패턴 매칭 가능하면 그냥 바로 평가해버리는것 같음) n을 얻어서, Z+n=n 인걸 알기 때문에 Refl만 쓰면 바로 증명이 됨
근데 덧셈이 왼쪽 인자에 대한 재귀로 정의되 있어서 n+Z 는 패턴 매칭이 안됨. 그래서 addZr은 재귀를 해서 n을 S n으로 분해해야됨.
Refl가 a=a면 대강 이해되네 진짜 개변태같은 언어구만
이정도면 난해한 프로그래밍언어로 분류해야되는거아니냐?ㅋㅋㅋㅋ