Skip to content

Instantly share code, notes, and snippets.

@LittleJianCH
Last active September 27, 2022 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LittleJianCH/373ed5d86afaf0c72fe4dc986895332e to your computer and use it in GitHub Desktop.
Save LittleJianCH/373ed5d86afaf0c72fe4dc986895332e to your computer and use it in GitHub Desktop.
nat in miniKanren
#lang racket
(require "Racket-miniKanren/minikanren/mk.rkt")
(defrel (conso a d p)
(== (cons a d) p))
(defrel (caro p a)
(fresh (d)
(conso a d p)))
(defrel (cdro p d)
(fresh (a)
(conso a d p)))
(define (build-nat n)
(cond
((= n 0) 'O)
(else (cons 'S (build-nat (- n 1))))))
(define (unbox-nat n)
(cond
((eq? n 'O) 0)
(else (+ 1 (unbox-nat (cdr n))))))
(defrel (succo a-1 a)
(conso 'S a-1 a))
(defrel (zero?o n)
(== n 'O))
(defrel (pos?o n)
(fresh (n-1)
(succo n-1 n)))
(defrel (+o a b c)
(conde
((zero?o a) (== b c))
((pos?o a)
(fresh (a-1 prev)
(succo a-1 a)
(succo prev c)
(+o a-1 b prev)))))
(defrel (*o a b c)
(conde
((zero?o a) (zero?o c))
((pos?o a) (zero?o b) (zero?o c))
((pos?o a) (pos?o b)
(fresh (a-1 prev)
(succo a-1 a)
(+o b prev c)
(*o a-1 b prev)))))
(map
(λ (p)
(cons (unbox-nat (car p))
(unbox-nat (cadr p))))
(run* (x y)
(*o x y (build-nat 120))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment