Skip to content

Instantly share code, notes, and snippets.

@jameshfisher
jameshfisher / halting_problem_javascript.md
Last active September 7, 2017 01:04
A proof that the Halting problem is undecidable, using JavaScript and examples

Having read a few proofs that the halting problem is undecidable, I found that they were quite inaccessible, or that they glossed over important details. To counter this, I've attempted to re-hash the proof using a familiar language, JavaScript, with numerous examples along the way.

This famous proof tells us that there is no general method to determine whether a program will finish running. To illustrate this, we can consider programs as JavaScript function calls, and ask whether it is possible to write a JavaScript function which will tell us

@startling
startling / Graph.hs
Last active December 20, 2015 07:39
-- | Some functions on directed graphs.
module Language.Coatl.Graph where
-- base
import Data.Maybe
-- containers
import Data.Map (Map)
import qualified Data.Map as M
import Data.Set (Set)
import qualified Data.Set as S
-- mtl
@washort
washort / tutorial.rst
Created August 18, 2012 06:29
parsley tutorial

Parsley Tutorial

From Regular Expressions To Grammars

Parsley is a pattern matching and parsing tool for Python programmers.

type nat = Zero | Succ of nat
let rec int_of_nat x =
match x with
| Zero -> 0
| Succ x' -> 1 + int_of_nat x'
let rec nat_of_int x =
match x with
| 0 -> Zero
import Prelude hiding (toInteger)
import Data.List
data Value = StringValue String
| IntegerValue Integer
| NameValue String
| FuncValue [String] AST
| NilValue
deriving Show
(define (unify a b)
(cond ((and (pair? a)
(pair? b)) (cons (unify (car a) (car b))
(unify (cdr a) (cdr b))))
((symbol? a) b) ; here i just return b, because a symbol matches anything. a more complex system would have a third argument
; , the environment, that tracks existing bindings for a, and prevents conflicts. then, instead of returning b
; we could update the environment with the binding for a = b, or issue a failure (in kanren language, #u)
((eq? a b) b) ; a and b trivially unify without updating any bindings. here I just return their mutual value