Core.logic - Classic AI

core.logic

Adapted to clojurescript flavor, derived from https://github.com/clojure/core.logic/wiki/Examples

3 Oct 2013 by rm-hull
rm-hull/6816234
classic-ai.cljs
(ns classic-ai-example
  (:require-macros [cljs.core.logic.macros :as m])
  (:use [cljs.core.logic :only [-take*]]))

(m/defne moveo [before action after]
  ([[:middle :onbox :middle :hasnot]
    :grasp
    [:middle :onbox :middle :has]])
  ([[pos :onfloor pos has]
    :climb
    [pos :onbox pos has]])
  ([[pos1 :onfloor pos1 has]
    :push
    [pos2 :onfloor pos2 has]])
  ([[pos1 :onfloor box has]
    :walk
    [pos2 :onfloor box has]]))

(m/defne cangeto [state out]
  ([[_ _ _ :has] true])
  ([_ _] (m/fresh [action next]
           (moveo state action next)
           (cangeto next out))))

(println 
  (m/run 1 [q]
    (cangeto [:atdoor :onfloor :atwindow :hasnot] q))) ; (true)