Skip to content

Instantly share code, notes, and snippets.

View brendanzab's full-sized avatar
😵‍💫
writing elaborators

Brendan Zabarauskas brendanzab

😵‍💫
writing elaborators
View GitHub Profile
(** Fractal binary trees
L-systems are a really wonderful model of plant growth, showing how a set of
simple grammar rules can result in incredibly life-like and complicated
organic forms.
They do however seem a little… stuck in the 80s? In L-systems the state of a
plant is modelled as a list of instructions, where the branching structure
emerges from an imperative interpretation of “push” and “pop” symbols. For
example an L-system that describes a fractal binary tree looks like this:
@brendanzab
brendanzab / stlc-infer.ml
Last active November 30, 2023 10:25
A demo of translating inference rules for the STLC into a type inference algorithm
(*
T ::=
| Bool
| T -> T
t ::=
| x
| \(x : T). t
| t t
@brendanzab
brendanzab / 00-eval-int.rs
Last active October 26, 2023 11:43
Arithmetic expression evaluators and compilers in Rust.
// Syntax
pub enum Expr {
Int(i32),
Neg(Box<Expr>),
Add(Box<Expr>, Box<Expr>),
Mul(Box<Expr>, Box<Expr>),
}
// Semantics
@brendanzab
brendanzab / phrases.ml
Last active September 18, 2023 07:02
silly phrase generator thing
(** Phrase generator based on an example from the Grammatical Framework tutorial.
- {{:https://okmij.org/ftp/gengo/NASSLLI10/}
Lambda: the ultimate syntax-semantics interface}
- {{:https://www.grammaticalframework.org/doc/tutorial/gf-tutorial.html#toc16}
Grammatical Framework Tutorial: Lesson 2}
Todo:
- generate languages (orthographies, vacabularies, grammars)
@brendanzab
brendanzab / elab_stlc.ml
Last active March 2, 2023 11:10
Elaborator for a simply typed lambda calculus (based on https://gist.github.com/aradarbel10/837aa65d2f06ac6710c6fbe479909b4c)
(** An elaborator for a simply typed lambda calculus with mutable metavars.
This implementation is based on Arad Arbel’s gist:
https://gist.github.com/aradarbel10/837aa65d2f06ac6710c6fbe479909b4c
*)
module Core = struct
(** {1 Types} *)
@brendanzab
brendanzab / bidir-stlc.rs
Last active June 21, 2023 07:18
Bidirectional type checker for a simple functional language, in Rust
//! Bidirectional type checker for a simple functional language
use std::rc::Rc;
#[derive(Clone, PartialEq, Eq)]
enum Type {
Bool,
Int,
Fun(Rc<Type>, Rc<Type>),
}
@brendanzab
brendanzab / state-monads.ml
Last active October 18, 2022 11:11
Attempts at encoding state monads using mutable references in OCaml
module IndexedMonad = struct
module type S = sig
type ('i, 'a) t
val pure : 'a -> (_, 'a) t
val bind : ('i, 'a) t -> ('a -> ('i, 'b) t) -> ('i, 'b) t
end
(** {0 An implementation of a small dependently typed language}
This is an implementation simple dependently typed language where types are
first-class and where the output types of functions may depend on the inputs
supplied to them.
Type checking is is implemented in terms of an {i elaborator}, which checks
and tanslates a user-friendly {i surface language} into a simpler and more
explicit {i core language} that is more closely connected to type theory.
Because we need to simplify types during elaboration we also implement an
@brendanzab
brendanzab / record-patching.ml
Last active September 13, 2022 06:12
Elaboration with Singletons and Record patching
(** {0 Elaboration with Record Patching and Singleton Types}
This is a small implementation of a dependently typed language with
dependent record types, with some additional features intended to make it
more convenient to use records as first-class modules. It was originally
ported from {{: https://gist.github.com/mb64/04315edd1a8b1b2c2e5bd38071ff66b5}
a gist by mb64}.
The type system is implemented in terms of an ‘elaborator’, which type
checks and tanslates a user-friendly surface language into a simpler and
@brendanzab
brendanzab / mltt-tarski.holbert
Last active May 18, 2022 12:59
Martin-Löf Type Theory in Holbert
[{"tag":"Heading","contents":[0,"Martin-Löf Type Theory"]},{"tag":"Paragraph","contents":"A description of Martin-Löf Type Theory in Holbert, by Brendan Zabarauskas."},{"tag":"Paragraph","contents":"Original gist: ~https://gist.github.com/brendanzab/1b4732179b15201bf33fed6dbca02458~"},{"tag":"Heading","contents":[2,"Introduction"]},{"tag":"Paragraph","contents":"/Martin-Löf Type Theory/ (MLTT), also known as /Intuitionistic Type Theory/, is a type theory proposed by Per Martin-Löf in the mid 70s. It forms the basis of many popular dependently typed programming languages and theorem provers, for example Agda, Coq, Idris, Epigram, and more. The influence of MLTT also extends to other languages, for example partly inspiring the module systems of Standard ML and OCaml, and in the work on adding dependent types to Haskell."},{"tag":"Paragraph","contents":"The main forms of judgement in this presentation of Martin-Löf Type theory are:\n\n- $A:_type A$\n which can be read as “$A:A$ is a type”\n\n- $A a:_:_ a A$\n