https://github.com/damhiya/AgdaHeap/blob/master/WBLT.agda
일단 weight biased leftist tree는 뭐냐면
https://en.wikipedia.org/wiki/Leftist_tree그래서 이걸 예전에 깃갤 문제 열릴때 만들어볼라고 했던건데 그때는 멍청해서 못맨듬
뭐 결과적으로 말하자면 저때 하던 접근법이 별로 좋지 않았음.
tree의 성질에 대한 증명을 tree자체에 저장하는건 멍청한 짓임. 타입을 별도로 정의하는게 훨씬 좋음.
위에 올린 구현을 좀 해설하자면
먼저 merge를 구현함. merge는 힙 두개를 병합하는 연산임.
근데 이게 그냥 하면 termination checking이 잘 안되서 accessibility를 사용해서 종료 검사를 도와줌.
(accessibility는 걍 재귀가 유한한 횟수 안에 끝나는걸 알려주는거임)
문제는 accessibility 때문에 불필요한 연산이 좀 생기는데, 이건 erasure (run-time irrelevance) 를 사용하면 문제가 안됨.
erasure는 간단히 말해서 컴파일 타임에 타입 검사에만 활용되고 런타임에 지워지는 정보임.
https://agda.readthedocs.io/en/v2.6.1.3/language/runtime-irrelevance.html그리고 Leftist랑 Heap이라는 데이터 타입을 정의하는데, 이건 각각 어떤 트리가 Leftist property하고 Heap property를 만족함을 표현하는 타입임.
merge가 Leftist property하고 Heap property를 보존함을 증명할 수 있음.
마지막으로 WBLT (Weight Biased Leftist Tree)를 정의하는데, 이건 그냥 위에서 정의한 Tree, Leftist, Heap 타입의 래퍼임.
WBLT 로 래핑된 트리는 항상 Leftist와 Heap property를 만족함.
마찬가지로 Leftist, Heap도 erasure로 지정해서 런타임 코스트를 안들게 할 수 있음.
erasure가 제대로 되면 증명 때문에 생기는 런타임 오버헤드는 이론상 사라짐.
이맥스 테마 뭐임?
드라큘란디요 님이 쓴다매요
내 드라큘라는 저런 색이 아니야
agda-mode 가 색상 건드린걸지도?
천재인듯 - dc App
본인 emacs dracula theme 컨트리뷰터임
폰트 머에요?
iosevka