INTRO

Мова кубічного тайпчекера cubicaltt, синтаксис якого базується на попередній мові cubical, про яку йшлося на сторінках журналу МАКСИМ в 2017 році. Сам cubical у свою чергу базується на японському тайпчекері Mini-TT, розмір якого на мові Haskell займає 400 рядків. Синтаксис мови у БНФ нотації є максимально компактним та не передбачає ускладнених конструкції як то тайпкласи, тактики чи навіть позиційні макроси, усього цього в кубічному тайпчекері немає. Так у нього є індуктивні типи, та вищі індуктивні типи які є моделями-вбудовуваннями (моделями часу виконання) CW-комплексів, але на цьому все. Здавалося б чому так бідно, але цього виявляється цілком достатньо аби формалізувати усю математику, інші мовні можливості з легкістю реалізуються при наявності мінімальної макросистеми. Такі теорем прувери як Coq, Lean мають більш потужні можливості до препроцесінгу програм, хоча мінімальна Notation як у Coq звісно не завадила би для цієї прекрасної мінімалістичної мови.

GRAMMAR

Формальна граматика цієї мови, окрім оригінальної статті CCHM описана також в статі про мінімальну конструктивну мову MLTT, яку можна вбудувати саму в себе. Але тут представлена актуальна версія грамматики в LALR(1) флейворі, для платформи Erlang, та її бібліотек leex та yeec, токен та парсер генераторів.

LEEX

A = [a-zA-Z_0-9\-\x{2074}-\x{208E}\x{2010}-\x{2191}\x{2193}-\x{2199}\x{2201}-\x{25FF}\x{3B1}-\x{3BA}\x{3BC}-\x{3FF}] S = ([\t\s\r\n]|--.*) B = [\r\n] Star = \* Unit = \(\) Slash = \\ Dot = \. Comma = \, Arrow = (\-\>|\→) Forall = (\\/|\∀) Meet = (/\\) Lambda = (\\|\λ) Curly = [\{\}] Angle = [\<\>] Parens = [\(\)] Square = [\[\]] Colon = \: Et = \@ Eq = \= Pipe = \|

YEEC

% package system mod -> 'module' id 'where' imp dec : {module,'$2','$4','$5'}. imp -> skip imp : '$2'. imp -> '$empty' : []. imp -> 'import' id imp : [{import,'$2'}|'$3']. % ids ids -> '$empty' : []. ids -> id ids : ['$1'|'$2']. % telescopes tele -> '$empty' : []. tele -> cotele : '$1'. cotele -> '(' exp ':' exp ')' tele : {tele,uncons('$2'),'$4','$6'}. % cubical homogeneous composition systems sys -> '[' sides ']' : {sys,'$2'}. sides -> '$empty' : []. sides -> side : '$1'. sides -> side ',' sides : ['$1'|'$3']. side -> '(' id '=' id ')' arrow exp : {side,'$2','$4','$7'}. formula -> formula forall f1 : {join,'$1','$3'}. formula -> f1 : '$1'. formula -> f2 : '$1'. f1 -> f1 meet f2 : {meet,'$1','$3'}. f1 -> f2 : '$1'. f2 -> '-' f2 : {neg,'$2'}. f2 -> id : '$1'. % core expression exp -> 'split' cobrs : {split,'$2'}. exp -> id : '$1'. exp -> id '{' exp '}': {inst,'$1','$h3'}. exp -> '<' ids '>' exp : {plam,uncons('$2'),'$4'}. exp -> exp '.1' : {fst,'$1'}. exp -> exp '.2' : {snd,'$1'}. exp -> lam cotele arrow exp : {lam,'$2','$4'}. exp -> cotele arrow exp : {pi,'$1','$3'}. exp -> exp arrow exp : {pi,'$1','$3'}. exp -> cotele '*' exp : {sigma,'$1','$3'}. exp -> 'comp' exp exp sys : {comp,'$2','$3','$4'}. exp -> 'fill' exp exp sys : {fill,'$2','$3','$4'}. exp -> 'glue' exp sys : {glue,'$2','$3'}. exp -> 'unglue' exp sys : {unglue,'$2','$3'}. exp -> exp ',' exp : uncons_p('$1','$3'). exp -> papp : '$1'. exp -> '(' exp ')' : '$2'. exp -> app : '$1'. % lambda and path applications app -> exp exp : {app,'$1','$2'}. papp -> exp '@' formula : {papp,'$1','$3'}. % top level inductive data and function declarations dec -> '$empty' : []. dec -> codec : '$1'. codec -> def skip dec : ['$1'|'$3']. codec -> def dec : ['$1'|'$2']. def -> 'data' id tele '=' sum : {data,'$2','$3','$5'}. def -> id tele ':' exp '=' exp : {def,'$1','$2','$4','$6'}. def -> id tele ':' exp '=' exp 'where' def : {def,'$1','$2','$4','$6','$8'}. % inductive and HIT introductions sum -> '$empty' : []. sum -> rsum : '$1'. rsum -> id tele : {ctor,'$1','$2'}. rsum -> id tele '|' rsum : [{ctor,'$1','$2'}|'$4']. rsum -> id tele '<' ids '>' sys : {htor,'$1','$2','$4','$6'}. rsum -> id tele '<' ids '>' sys '|' rsum : [{htor,'$1','$2','$4','$6'}|'$8']. % inductive and HIT eliminators cobrs -> '|' br brs : ['$2'|'$3']. br -> ids arrow exp : {br,'$1','$3'}. br -> ids '@' ids arrow exp : {br,'$1','$3','$5'}. brs -> '$empty' : []. brs -> cobrs : '$1'. Nonterminals mod imp tele exp app dec def ids sum cotele rsum br brs cobrs codec formula f1 f2 side sides sys papp. Terminals id digits atom oper skip lam meet arrow forall '(' ')' '[' ']' '<' '>' '{' '}' '.' ',' ':' '=' '#' '|' '-' '*' '/' '@' '0' '1' 'module' 'where' 'import' 'record' 'data' 'split' 'let' 'in' '.1' '.2' 'comp' 'fill' 'glue' 'unglue'.

RUN

Для запуску кубічного синтаксичного фронтенду скористайтеся MAD.

$ git clone git://github.com/groupoid/homotopy && cd homotopy $ mad compile release homotopy $ ./homotopy parse file core/mltt.ctt

Адреса репозиторію — groupoid/anders.