Skip to content

Instantly share code, notes, and snippets.

@ahitrin
Created November 9, 2012 19:08
Show Gist options
  • Save ahitrin/4047587 to your computer and use it in GitHub Desktop.
Save ahitrin/4047587 to your computer and use it in GitHub Desktop.
Перевод примера из книги "Seven Languages in Seven Weeks" с Prolog на clojure.core.logic
(ns logic-in-clojure.core
(:refer-clojure :exclude [==])
(:use clojure.core.logic))
;; prolog example:
;;
;; likes(wallace, cheese).
;; likes(grommit, cheese).
;; likes(wendolene, sheep).
;; friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).
;;
;; likes(wallace, sheep). -> no
;; likes(wallace, cheese). -> yes
;; friend(wallace, wallace). -> no
;; friend(wallace, grommit). -> yes
;; friend(wendolene, grommit). -> no
(defrel likes c i)
(fact likes 'wallace 'cheese)
(fact likes 'grommit 'cheese)
(fact likes 'wendolene 'sheep)
(defn friend? [x y]
(not (empty? (run* [q]
(fresh [z]
(likes x z)
(likes y z)
(if (= x y) fail succeed))))))
(friend? 'wallace 'grommit) ;; -> true
(friend? 'grommit 'wallace) ;; -> true
(friend? 'wallace 'wallace) ;; -> false
(friend? 'wallace 'wendolene) ;; -> false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment