Skip to content

Instantly share code, notes, and snippets.

View eignnx's full-sized avatar

eignnx eignnx

View GitHub Profile
data Number = singular | plural
data Person = 1st | 2nd | 3rd
data Gender = nonbinary | feminine | masculine | neutral
rule start = english_sentence + "."
rule english_sentence
= pronoun.Number.Person.Gender are.Number.Person.Gender adj
| subj.N1.G1 verb.N1.G1 obj.N2.G2
@eignnx
eignnx / plus-plus-arrow.pl
Last active April 11, 2021 01:15
A Prolog `term_expansion` rule for a modified DCG arrow. It automatically builds syntax trees as it parses.
:- module(cfg_macro, [
op(1200, xfx, ++>)
]).
:- op(1200, xfx, ++>).
/*
The rule:
s ++> np(blah), vp.
translates to:
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
import Debug.Trace ( trace )
type Ident = String
data Value
= Var Ident
| Bool Bool
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE PatternSynonyms #-}
import Data.Maybe
import Control.Monad.State
import Data.List
data Ty
= Unit -- The unit type.
@eignnx
eignnx / hindley-milner.pl
Last active January 3, 2024 16:03
An implementation of the Hindley-Milner type inference algorithm in SWI-Prolog.
:- op(600, yfx, '@'). % Function application
:- op(450, xfy, '=>'). % Type variable quantification
:- op(1150, fx, mode).
% Defines/validates a typing context.
tcx([]).
tcx([X-Sigma | Tcx]) :-
atom(X),
sigma_type(Sigma),
tcx(Tcx).
:- op(350, yfx, @).
:- set_prolog_flag(occurs_check, error).
:- det(inference/3).
inference(true, bool, _).
inference(false, bool, _).