From 9b964acdb0cc36d09193861b8f7d33aea248ee46 Mon Sep 17 00:00:00 2001 From: Jedidiah Barber Date: Thu, 29 Jan 2026 22:12:41 +1300 Subject: Some equivalent test programs in Scheme running on microKanren and miniKanren for benchmark comparisons --- scheme/mk.scm | 269 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 scheme/mk.scm (limited to 'scheme/mk.scm') diff --git a/scheme/mk.scm b/scheme/mk.scm new file mode 100644 index 0000000..9917284 --- /dev/null +++ b/scheme/mk.scm @@ -0,0 +1,269 @@ + +; miniKanren core from simple-miniKanren + +; https://minikanren.org +; https://github.com/miniKanren/simple-miniKanren + + +;;; This file was generated by writeminikanren.pl +;;; Generated at 2007-10-25 15:24:42 + +(define-syntax lambdag@ + (syntax-rules () + ((_ (p) e) (lambda (p) e)))) + +(define-syntax lambdaf@ + (syntax-rules () + ((_ () e) (lambda () e)))) + +(define-syntax run* + (syntax-rules () + ((_ (x) g ...) (run #f (x) g ...)))) + +(define-syntax rhs + (syntax-rules () + ((_ x) (cdr x)))) + +(define-syntax lhs + (syntax-rules () + ((_ x) (car x)))) + +(define-syntax size-s + (syntax-rules () + ((_ x) (length x)))) + +(define-syntax var + (syntax-rules () + ((_ x) (vector x)))) + +(define-syntax var? + (syntax-rules () + ((_ x) (vector? x)))) + +(define empty-s '()) + +(define walk + (lambda (u S) + (cond + ((and (var? u) (assq u S)) => + (lambda (pr) (walk (rhs pr) S))) + (else u)))) + +(define ext-s + (lambda (x v s) + (cons `(,x . ,v) s))) + +(define unify + (lambda (u v s) + (let ((u (walk u s)) + (v (walk v s))) + (cond + ((eq? u v) s) + ((var? u) (ext-s-check u v s)) + ((var? v) (ext-s-check v u s)) + ((and (pair? u) (pair? v)) + (let ((s (unify + (car u) (car v) s))) + (and s (unify + (cdr u) (cdr v) s)))) + ((equal? u v) s) + (else #f))))) + +(define ext-s-check + (lambda (x v s) + (cond + ((occurs-check x v s) #f) + (else (ext-s x v s))))) + +(define occurs-check + (lambda (x v s) + (let ((v (walk v s))) + (cond + ((var? v) (eq? v x)) + ((pair? v) + (or + (occurs-check x (car v) s) + (occurs-check x (cdr v) s))) + (else #f))))) + +(define walk* + (lambda (w s) + (let ((v (walk w s))) + (cond + ((var? v) v) + ((pair? v) + (cons + (walk* (car v) s) + (walk* (cdr v) s))) + (else v))))) + +(define reify-s + (lambda (v s) + (let ((v (walk v s))) + (cond + ((var? v) + (ext-s v (reify-name (size-s s)) s)) + ((pair? v) (reify-s (cdr v) + (reify-s (car v) s))) + (else s))))) + +(define reify-name + (lambda (n) + (string->symbol + (string-append "_" "." (number->string n))))) + +(define reify + (lambda (v s) + (let ((v (walk* v s))) + (walk* v (reify-s v empty-s))))) + +(define-syntax mzero + (syntax-rules () ((_) #f))) + +(define-syntax inc + (syntax-rules () ((_ e) (lambdaf@ () e)))) + +(define-syntax unit + (syntax-rules () ((_ a) a))) + +(define-syntax choice + (syntax-rules () ((_ a f) (cons a f)))) + +(define-syntax case-inf + (syntax-rules () + ((_ e (() e0) ((f^) e1) ((a^) e2) ((a f) e3)) + (let ((a-inf e)) + (cond + ((not a-inf) e0) + ((procedure? a-inf) (let ((f^ a-inf)) e1)) + ((not (and (pair? a-inf) + (procedure? (cdr a-inf)))) + (let ((a^ a-inf)) e2)) + (else (let ((a (car a-inf)) (f (cdr a-inf))) + e3))))))) + +(define-syntax run + (syntax-rules () + ((_ n (x) g0 g ...) + (take n + (lambdaf@ () + ((fresh (x) g0 g ... + (lambdag@ (s) + (cons (reify x s) '()))) + empty-s)))))) + +(define take + (lambda (n f) + (if (and n (zero? n)) + '() + (case-inf (f) + (() '()) + ((f) (take n f)) + ((a) a) + ((a f) + (cons (car a) + (take (and n (- n 1)) f))))))) + +(define == + (lambda (u v) + (lambdag@ (s) + (unify u v s)))) + +(define-syntax fresh + (syntax-rules () + ((_ (x ...) g0 g ...) + (lambdag@ (s) + (inc + (let ((x (var 'x)) ...) + (bind* (g0 s) g ...))))))) + +(define-syntax bind* + (syntax-rules () + ((_ e) e) + ((_ e g0 g ...) (bind* (bind e g0) g ...)))) + +(define bind + (lambda (a-inf g) + (case-inf a-inf + (() (mzero)) + ((f) (inc (bind (f) g))) + ((a) (g a)) + ((a f) (mplus (g a) (lambdaf@ () (bind (f) g))))))) + +(define-syntax conde + (syntax-rules () + ((_ (g0 g ...) (g1 g^ ...) ...) + (lambdag@ (s) + (inc + (mplus* + (bind* (g0 s) g ...) + (bind* (g1 s) g^ ...) ...)))))) + +(define-syntax mplus* + (syntax-rules () + ((_ e) e) + ((_ e0 e ...) (mplus e0 + (lambdaf@ () (mplus* e ...)))))) + +(define mplus + (lambda (a-inf f) + (case-inf a-inf + (() (f)) + ((f^) (inc (mplus (f) f^))) + ((a) (choice a f)) + ((a f^) (choice a (lambdaf@ () (mplus (f) f^))))))) + +(define-syntax conda + (syntax-rules () + ((_ (g0 g ...) (g1 g^ ...) ...) + (lambdag@ (s) + (inc + (ifa ((g0 s) g ...) + ((g1 s) g^ ...) ...)))))) + +(define-syntax ifa + (syntax-rules () + ((_) (mzero)) + ((_ (e g ...) b ...) + (let loop ((a-inf e)) + (case-inf a-inf + (() (ifa b ...)) + ((f) (inc (loop (f)))) + ((a) (bind* a-inf g ...)) + ((a f) (bind* a-inf g ...))))))) + +(define-syntax condu + (syntax-rules () + ((_ (g0 g ...) (g1 g^ ...) ...) + (lambdag@ (s) + (inc + (ifu ((g0 s) g ...) + ((g1 s) g^ ...) ...)))))) + +(define-syntax ifu + (syntax-rules () + ((_) (mzero)) + ((_ (e g ...) b ...) + (let loop ((a-inf e)) + (case-inf a-inf + (() (ifu b ...)) + ((f) (inc (loop (f)))) + ((a) (bind* a-inf g ...)) + ((a f) (bind* (unit a) g ...))))))) + +(define-syntax project + (syntax-rules () + ((_ (x ...) g g* ...) + (lambdag@ (s) + (let ((x (walk* x s)) ...) + ((fresh () g g* ...) s)))))) + +(define succeed (== #f #f)) + +(define fail (== #f #t)) + +(define onceo + (lambda (g) + (condu + (g succeed) + ((== #f #f) fail)))) -- cgit