Author SHA1 Message Date
Roman Volosovskyi d1d23ba03b logging 2016-03-28 12:48:42 +03:00
Roman Volosovskyi ddd3af1500 second attempt 2016-03-27 00:06:35 +02:00
Roman Volosovskyi 61b5a8b8d4 first attempt of refactoring 2016-03-15 19:00:52 +02:00
Roman Volosovskyi d8d50c537a Merge pull request #13 from TonyLo1/master
Added najure.actors namespace and tidied up ns declarations
2016-03-15 13:29:11 +02:00
Jarrad a24c9901c3 Merge pull request #14 from jarradh/grammar
add desire value with plausibility and desirability
2016-03-09 15:52:12 +01:00
Jarrad Hope 17e5249d31 add desire value with plausibility and desirability 2016-03-09 15:20:35 +01:00
Tony Lofthouse 7ce895a571 Added updated Actor files and new narujure.core 2016-03-08 10:13:24 +00:00
Tony Lofthouse 7177bfb120 Added updated Actor files and new narujure.core 2016-03-08 10:09:34 +00:00
Tony Lofthouse cacfa17ec1 Clojure dependency changed to 1.7.0 due to incompatibility with Pulsar 0.7.4 2016-03-08 10:06:17 +00:00
Tony Lofthouse 9b637071f7 Added narjure.actor namespace and Tidied up ns declarations 2016-03-07 20:30:31 +00:00
Roman Volosovskyi 7dbcf24e7b syntactic complexity 2016-03-06 21:47:31 +02:00
Roman Volosovskyi 9ff12f3f98 tenses 2016-03-06 21:25:15 +02:00
Roman Volosovskyi 05d6953e76 action -> task-type 2016-03-06 20:13:43 +02:00
Tony Lofthouse 273fcb0bb2 Added narjure.actors namespace and Tidied up ns declarations 2016-02-29 20:16:45 +00:00
Tony Lofthouse 989cd61928 Added narjure.actors namespace and Tidied up ns declarations 2016-02-29 16:03:41 +00:00
Tony Lofthouse 70f34ebd25 Added narjure.actors namespace and Tidied up ns declarations 2016-02-29 16:02:16 +00:00
Tony Lofthouse 27e9e2e18c Added narjure.actors namespace and Tidied up ns declarations 2016-02-29 14:31:25 +00:00
Tony Lofthouse d8a4027d27 Tidied up ns declarations 2016-02-29 14:09:13 +00:00
Tony Lofthouse 9bee8f5b47 Tidied up ns declarations 2016-02-29 14:07:40 +00:00
Tony Lofthouse 7601e12df7 Tidied up ns declarations 2016-02-29 14:05:27 +00:00
Tony Lofthouse 6ca640c40f Tidied up logger calls in actors 2016-02-29 10:18:18 +00:00
Tony Lofthouse 215588d4fb Update logger and main entry point. Now it it (start-nars) 2016-02-29 09:49:32 +00:00
Tony Lofthouse 8af5972dff Made changes as suggested by Rasom; removed multiple :requires in ns, removed duplicate ns in logger , changed unnecessary defsfn calls to defn 2016-02-28 22:20:24 +00:00
Tony Lofthouse 37341642e4 Added actor framework - currently two -main functions (additional one in nars.core) 2016-02-28 20:49:48 +00:00
Jarrad Hope 54c88af81e documentation on internal representation 2016-02-12 16:34:54 +01:00
Jarrad Hope 9324907f24 documentation on internal representation 2016-02-12 10:31:50 +01:00
20 changed files with 615 additions and 32 deletions
+2 -1
View File
@@ -13,4 +13,5 @@ pom.xml.asc
*.iml
*~
\#*\#
.\#*
.\#*
*experiments.clj
+9 -3
View File
@@ -3,16 +3,22 @@
:url "https://github.com/jarradh/narjure"
:license {:name "GNU General Public License 2.0"
:url "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
:dependencies [[org.clojure/clojure "1.7.0"]
[org.clojure/core.logic "0.8.10"]
[instaparse "1.4.1"]
[com.rpl/specter "0.9.1"]
[org.clojure/tools.nrepl "0.2.12"]
[org.clojure/data.priority-map "0.0.7"]]
[org.clojure/data.priority-map "0.0.7"]
[co.paralleluniverse/pulsar "0.7.4"]
[org.immutant/immutant "2.1.2"]
[clj-time "0.11.0"]
[com.taoensso/timbre "4.3.1"]]
:java-agents [[co.paralleluniverse/quasar-core "0.7.4"]]
:main ^:skip-aot narjure.core
:plugins [[lein-cloverage "1.0.6"]
[cider/cider-nrepl "0.11.0-SNAPSHOT"]]
:target-path "target/%s"
:repl-options {:init-ns narjure.repl
:nrepl-middleware [narjure.repl/narsese-handler]}
:profiles {:uberjar {:aot :all}})
:profiles {:uberjar {:aot :all}}
:jvm-opts ["-Dco.paralleluniverse.fibers.detectRunawayFibers=false"])
+11 -7
View File
@@ -5,7 +5,7 @@
sentence ::= statement"." [tense] [truth] (* judgement to be remembered *)
| statement"?" [tense] [truth] (* question to be answered, tense added in OpenNARS 1.7 *)
| statement"@" [tense] [truth] (* question on desire value to be answered, tense added in OpenNARS 1.7 *)
| statement"!" [tense] [truth] (* goal to be realized, tense added in OpenNARS 1.7 *)
| statement"!" [tense] [desire] (* goal to be realized, tense added in OpenNARS 1.7 *)
statement ::= <"<">term copula term<">"> (* two terms related to each other *)
| <"(">term copula term<")"> (* two terms related to each other, new notation *)
@@ -15,15 +15,15 @@
copula ::= "-->" (* inheritance *)
| "<->" (* similarity *)
| "{--" (* instance *)
| "--]" (* property *)
| "{-]" (* instance-property *)
| "{--" (* o-- instance *)
| "--]" (* --o property *)
| "{-]" (* o-o instance-property *)
| "==>" (* implication *)
| "=/>" (* predictive implication *)
| "=/>" (* =+> predictive implication *)
| "=|>" (* concurrent implication *)
| "=\\>" (* =\> retrospective implication *)
| "=\\>" (* =-> retrospective implication *)
| "<=>" (* equivalence *)
| "</>" (* predictive equivalence *)
| "</>" (* <+> predictive equivalence *)
| "<|>" (* concurrent equivalence *)
term ::= word (* an atomic constant term *)
@@ -72,6 +72,7 @@
interval ::= <"/">#"\d+" (* integer *)
truth ::= <"%">frequency[<";">confidence]<"%"> (* two numbers in [0,1]x(0,1) *)
desire ::= <"%">plausibility[<";">desirability]<"%"> (* two numbers in [0,1]x(0,1) *)
budget ::= <"$">priority[<";">durability][<";">quality]<"$"> (* three numbers in [0,1]x(0,1)x[0,1] *)
word : #"\w+" (* unicode string *)
@@ -80,3 +81,6 @@
quality : #"([0]?\.[0-9]+|1\.[0]*|1|0)" (* 0 <= x <= 1 *)
frequency : #"([0]?\.[0-9]+|1\.[0]*|1|0)" (* 0 <= x <= 1 *)
confidence : #"[0]?\.[0]*[1-9]{1}[0-9]*" (* 0 < x < 1 *)
plausibility : #"([0]?\.[0-9]+|1\.[0]*|1|0)" (* 0 <= x <= 1 *)
desirability : #"[0]?\.[0]*[1-9]{1}[0-9]*" (* 0 < x < 1 *)
@@ -0,0 +1,28 @@
(ns narjure.actor.active-concept-collator
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare process active-concept-collator)
(def aname :active-concept-collator)
(defsfn active-concept-collator
"State is collection of active concepts."
[]
(register! aname @self)
(set-state! [])
(actor-loop aname process))
(defhandler process)
(defmethod process :inference-tick-msg [_ _]
;(debug aname "process-inference-tick")
[])
(defmethod process :active-concept-msg [_ _]
(debug aname "process-active-concept"))
+36
View File
@@ -0,0 +1,36 @@
(ns narjure.actor.anticipated-event
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self !]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare anticipated-event process)
(def aname :anticipated-event)
(defsfn anticipated-event
"State is system-time and collection of anticipated events."
[]
(register! aname @self)
(set-state! {:time 0 :anticipated-events {}})
(actor-loop aname process))
(defhandler process)
(defmethod process :system-time-msg
[[_ time] state]
(debug aname "process-system-time")
{:time time :anticipated-events (state :percepts)})
(defmethod process :anticipated-event-msg
[_ _]
#_(debug aname "process-anticipated-event"))
(defmethod process :input-task-msg
[[_ input-task] _]
#_(debug aname "process-input-task")
(! :task-dispatcher [:task-msg input-task]))
+34
View File
@@ -0,0 +1,34 @@
(ns narjure.actor.concept
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state!]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :as t])
(:refer-clojure :exclude [promise await]))
(declare concept process)
(defsfn concept
"State is a map
{:name :budget :activation-level :belief-tab :goal-tab :task-bag :term-bag}
(this list may not be complete)."
[]
(set-state! {})
(actor-loop :concept process))
(defhandler process)
(defn debug [msg] (t/debug :concept msg))
(defmethod process :task [_ _]
#_(debug "process-task"))
(defmethod process :belief-req [_ _]
(debug "process-belief-req"))
(defmethod process :inference-req [_ _]
(debug "process-inference-req"))
(defmethod process :persistence-req [_ _]
(debug "process-persistence-req"))
+38
View File
@@ -0,0 +1,38 @@
(ns narjure.actor.concept-creator
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self ! spawn]]]
[narjure.actor.concept :refer [concept]]
[narjure.actor.utils :refer [actor-loop]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare concept-creator process-task)
(def aname :concept-creator)
(defsfn concept-creator
[]
(register! aname @self)
(actor-loop aname process-task))
(defn create-concept
;TODO: update state for concept-actor to state initialiser
;TODO: Create required sub-term concepts and propogate budget
[task c-map]
(let [{term :term} task]
(swap! c-map assoc term (spawn concept))
#_(debug aname (str "Created concept: " term))))
(defn process-task
"When concept-map does not contain :term, create concept actor for term
then post task to task-dispatcher either way."
[[_ from task c-map] _]
(let [term (task :term)]
; when concept not exist then create - goes here
(when (not (contains? @c-map term))
(create-concept task c-map)))
(! from [:task-msg task])
#_(debug aname "concept-creator - process-task"))
@@ -0,0 +1,29 @@
(ns narjure.actor.cross-modal-integrator
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare cross-modal-integrator process)
(def aname :cross-modal-integrator)
(defsfn cross-modal-integrator
"State is system-time and collection of precepts from current duration window."
[]
(register! :cross-modal-integrator @self)
(set-state! {:time 0 :percepts []})
(actor-loop aname process))
(defhandler process)
(defmethod process :system-time [[_ time] state]
(debug aname "process-system-time")
{:time time :percepts (state :percepts)})
(defmethod process :percept-sentence [_ _]
(debug aname "process-percept-sentence"))
@@ -0,0 +1,26 @@
(ns narjure.actor.derived-task-creator
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare derived-task-creator process)
(def aname :derived-task-creator)
(defsfn derived-task-creator
"State is system-time."
[]
(register! aname @self)
(set-state! {:time 0})
(actor-loop aname process))
(defn process-system-time [[_ time] _]
(debug aname "process-system-time")
{:time time})
(defn process-inference-result [_ _]
(debug aname "process-inference-result"))
@@ -0,0 +1,27 @@
(ns narjure.actor.forgettable-concept-collator
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare forgettable-concept-collator process)
(def aname :forgettable-concept-collator)
(defsfn forgettable-concept-collator
"State is collection of forgettable concepts."
[]
(register! :forgettable-concept-collator @self)
(set-state! [])
(actor-loop aname process))
(defhandler process)
(defmethod process :forgetting-tick-msg [_ _]
#_(debug aname "process-forgetting-tick"))
(defmethod process :forgettable-concept-msg [_ _]
(debug aname "process-forgettable-concept"))
+24
View File
@@ -0,0 +1,24 @@
(ns narjure.actor.general-inferencer
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare general-inferencer do-inference)
(def aname :general-inferencer)
(defsfn general-inferencer
"state is inference rule trie or equivalent"
[]
(register! aname @self)
(set-state! {:trie 0})
(actor-loop aname do-inference))
(defn do-inference [_ _]
(debug aname "process-do-inference"))
+31
View File
@@ -0,0 +1,31 @@
(ns narjure.actor.operator-executor
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare operator-executor process)
(def aname :operator-executor)
(defsfn operator-executor
"state is system-time"
[]
(register! aname @self)
(set-state! {:time 0})
(actor-loop aname process))
(defhandler process)
(defmethod process :system-time-msg [[_ time] _]
(debug aname "process-system-time")
{:time time})
(defmethod process :operator-execution-req-msg [_ _]
(debug aname "process-operator-execution-req"))
+22
View File
@@ -0,0 +1,22 @@
(ns narjure.actor.persistence-manager
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare concept-state persistence-manager)
(def aname :persistence-manager)
(defsfn persistence-manager
"state is file system handles"
[in-state]
(register! aname @self)
(set-state! in-state)
(actor-loop aname concept-state))
(defn concept-state [_ _]
(debug aname "process-concept-state"))
+43
View File
@@ -0,0 +1,43 @@
(ns narjure.actor.sentence-parser
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self !]]]
[narjure.narsese :refer [parse]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug info]])
(:refer-clojure :exclude [promise await]))
(declare sentence-parser process)
(def aname :sentence-parser)
(def serial-no (atom 0))
(defsfn sentence-parser
[]
(register! aname @self)
(set-state! {:time 0})
(actor-loop aname process))
(defhandler process)
(defmethod process :system-time-msg [[_ time] _]
(debug aname "process-system-time")
{:time time})
(defn parse-task
"Parses a narsese string."
[string system-time]
(assoc (parse string)
:stamp
{:id (swap! serial-no inc)
:creation-time system-time
:occurrence-time system-time
:trail [serial-no]}))
(defmethod process :narsese-string-msg
[[_ string] {time :time}]
(let [task (parse-task string time)]
(! :anticipated-event [:input-task-msg task])
(info aname (str "process-narsese-string" task))))
+23
View File
@@ -0,0 +1,23 @@
(ns narjure.actor.system-time
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self]]]
[narjure.actor.utils :refer [actor-loop]]
[taoensso.timbre :refer [debug]])
(:refer-clojure :exclude [promise await]))
(declare system-time system-time-tick)
(def aname :system-time)
(defsfn system-time
"state is system-time"
[]
(register! aname @self)
(set-state! 0)
(actor-loop aname system-time-tick))
(defn system-time-tick [_ state]
;(debug aname (str "process-system-time-tick " state))
(inc state))
+37
View File
@@ -0,0 +1,37 @@
(ns narjure.actor.task-dispatcher
(:require
[co.paralleluniverse.pulsar
[core :refer [defsfn]]
[actors :refer [register! set-state! self ! whereis]]]
[narjure.actor.utils :refer [actor-loop defhandler]]
[taoensso.timbre :refer [debug info]])
(:refer-clojure :exclude [promise await]))
(declare task-dispatcher process)
(def aname :task-dispatcher)
(def c-map (atom {}))
(defsfn task-dispatcher
"concept-map is atom {:term :actor-ref} shared between
task-dispatcher and concept-creator"
[]
(register! aname @self)
(actor-loop aname process))
(defhandler process)
(defmethod process :task-msg
[[_ input-task] _]
(let [concept-creator (whereis :concept-creator)
term (input-task :term)]
(if-let [concept (@c-map term)]
(! concept :task-msg input-task)
(! concept-creator [:create-concept-msg @self input-task c-map])))
#_(debug aname (str "process-task" input-task)))
(defmethod process :forget-concept-msg [[_ forget-concept] _]
(debug aname "process-forget-concept"))
(defmethod process :concept-count-msg [_ _]
(info aname (format "Concept count[%s]" (count @c-map))))
+19
View File
@@ -0,0 +1,19 @@
(ns narjure.actor.utils
(:require
[co.paralleluniverse.pulsar
[actors :refer [set-state! state receive !]]]
[taoensso.timbre :refer [debug]]))
(defmacro defhandler [name]
`(do
(defmulti ~name (fn [[t#] c#] t#))
(defmethod ~name :default [a# b#] :unhandled)))
(defmacro actor-loop [name f]
`(loop []
(let [msg# (receive)
result# (~f msg# @state)]
(if (= :unhandled result#)
(debug ~name (str "unhandled msg:" msg#))
(set-state! result#))
(recur))))
+142 -6
View File
@@ -1,8 +1,144 @@
(ns narjure.core
(:require [instaparse.core :as insta])
(:gen-class))
(:require
[co.paralleluniverse.pulsar
[core :refer :all]
[actors :refer :all]]
[immutant.scheduling :refer :all]
[narjure.actor
[active-concept-collator :refer [active-concept-collator]]
[anticipated-event :refer [anticipated-event]]
[concept-creator :refer [concept-creator]]
[cross-modal-integrator :refer [cross-modal-integrator]]
[derived-task-creator :refer [derived-task-creator]]
[forgettable-concept-collator :refer [forgettable-concept-collator]]
[general-inferencer :refer [general-inferencer]]
[operator-executor :refer [operator-executor]]
[persistence-manager :refer [persistence-manager]]
[sentence-parser :refer [sentence-parser]]
[system-time :refer [system-time]]
[task-dispatcher :refer [task-dispatcher]]]
[taoensso.timbre :refer [info set-level!]])
(:refer-clojure :exclude [promise await])
(:import (ch.qos.logback.classic Level)
(org.slf4j LoggerFactory))
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
((insta/parser (clojure.java.io/resource "narsese.bnf") :auto-whitespace :standard) "<bird --> swimmer>. %0.10;0.60%"))
(set-level! :info)
(doseq [logger ["co.paralleluniverse.actors.JMXActorMonitor"
"org.quartz.core.QuartzScheduler"
"co.paralleluniverse.actors.LocalActorRegistry"
"co.paralleluniverse.actors.ActorRegistry"
"org.projectodd.wunderboss.scheduling.Scheduling"]]
(.setLevel (LoggerFactory/getLogger logger) Level/OFF))
;co.paralleluniverse.actors.JMXActorMonitor
(def actors-names
#{:active-concept-collator
:anticipated-event
:concept-creator
:cross-modal-integrator
:derived-task-creator
:forgettable-concept-collator
:general-inferencer
:operator-executor
:persistence-manager
:sentence-parser
:system-time
:task-dispatcher})
(defn create-system-actors
"Spawns all actors which self register!"
[]
(spawn active-concept-collator)
(spawn anticipated-event)
(spawn concept-creator)
(spawn cross-modal-integrator)
(spawn derived-task-creator)
(spawn forgettable-concept-collator)
(spawn general-inferencer)
(spawn operator-executor)
(spawn persistence-manager :state)
(spawn sentence-parser)
(spawn system-time)
(spawn task-dispatcher))
(defn check-actor [actor-name]
(info (if (whereis actor-name) "\t[OK]" "\t[FAILED]") (str actor-name)))
(defn check-actors-registered []
(info "Checking all services are registered...")
(doseq [actor-name actors-names]
(check-actor actor-name))
(info "All services registered."))
(def inference-tick-interval 2500)
(def forgetting-tick-interval 3000)
(def system-tick-interval 2000)
(defn inference-tick []
(! :active-concept-collator [:inference-tick-msg]))
(defn forgetting-tick []
(! :forgettable-concept-collator [:forgetting-tick-msg]))
(defn system-tick []
(! :system-time [:system-time-tick-msg]))
(defn prn-ok [msg] (info (format "\t[OK] %s" msg)))
(defn start-timers []
(info "Initialising system timers...")
(schedule inference-tick {:in inference-tick-interval
:every inference-tick-interval})
(prn-ok :system-timer)
(schedule forgetting-tick {:in forgetting-tick-interval
:every forgetting-tick-interval})
(prn-ok :forgetting-timer)
(schedule system-tick {:every system-tick-interval})
(prn-ok :inference-timer)
(info "System timer initialisation complete."))
(defn start-nars [& _]
(info "NARS initialising...")
; spawn all actors except concepts
(create-system-actors)
; allow delay for all actors to be initialised
(sleep 1 :sec)
(check-actors-registered)
(start-timers)
; update user with status
(info "NARS initialised.")
; *** Test code
(let [task-dispatcher (whereis :task-dispatcher)]
(info "Beginning test...")
(time
(loop [n 0]
(when (< n 1000000)
; select approximately 90% from existing concepts
(let [n1 (if (< (rand) 0.01) n (rand-int (/ n 10)))]
(! task-dispatcher [:task-msg {:term (format "a --> %d" n1)
:other "other"}])
(when (== (mod n 100000) 0)
(info (format "processed [%s] messages" n))))
(recur (inc n))))))
; allow delay for all actors to process their queues
(Thread/sleep 100)
(info "Test complete.")
; *** End test code
; join all actors so the terminate cleanly
(doseq [actor-name actors-names]
(join (whereis actor-name)))
; cancel schedulers
(stop))
; call main function
(defn run []
(future (start-nars)))
+1 -1
View File
@@ -117,7 +117,7 @@
(update-in c [:answers q] choice-with-nil belief))
concept questions))
(defmulti task->concept (fn [& args] (:action (first args))))
(defmulti task->concept (fn [& args] (:task-type (first args))))
(defmethod task->concept :question
[{:keys [statement] :as task} {:keys [concepts] :as m} term]
+33 -14
View File
@@ -40,16 +40,23 @@
"&/" 'sequential-events
"&|" 'parallel-events})
(def tenses
{":|:" :present
":/:" :future
":\\:" :past})
(defn get-compound-term [[_ operator-srt]]
(compound-terms operator-srt))
(def actions {"." :judgement
"?" :question})
(def task-types {"." :judgement
"?" :question})
(def ^:dynamic *action* (atom nil))
(def ^:dynamic *task-type* (atom nil))
(def ^:dynamic *lvars* (atom []))
(def ^:dynamic *truth* (atom []))
(def ^:dynamic *budget* (atom []))
(def ^:dynamic *tense* (atom :present))
(def ^:dynamic *syntactic-complexity* nil)
(defn keep-cat [fun col]
(into [] (comp (mapcat fun) (filter (complement nil?))) col))
@@ -64,16 +71,20 @@
(defmethod element :sentence [[_ & data]]
(let [filtered (group-by string? data)]
(reset! *action* (actions (first (filtered true))))
(reset! *task-type* (task-types (first (filtered true))))
(let [cols (filtered false)
last-el (last cols)]
(when (= :truth (first last-el))
(element last-el))
(when-let [tense (some #(when (= :tense (first %)) %) data)]
(element tense))
(element (first cols)))))
(defmethod element :statement [[_ & data]]
(if-let [copula (get-copula data)]
`[~copula ~@(keep-cat element data)]
(do
(swap! *syntactic-complexity* inc)
`[~copula ~@(keep-cat element data)])
(keep-cat element data)))
(defmethod element :task [[_ & data]]
@@ -125,9 +136,13 @@
(element (last data)))
(defmethod element :term [[_ & data]]
(swap! *syntactic-complexity* inc)
(when (seq? data)
(keep element data)))
(defmethod element :tense [[_ key]]
(reset! *tense* (tenses key)))
(defmethod element :default [_])
;TODO check for variables in statemnts, ignore subterm if it contains variable
@@ -148,16 +163,20 @@
[narsese-str]
(let [data (parser narsese-str)]
(if-not (i/failure? data)
(binding [*action* (atom nil)
(binding [*task-type* (atom nil)
*lvars* (atom [])
*truth* (atom [])
*budget* (atom [])]
*budget* (atom [])
*tense* (atom :present)
*syntactic-complexity* (atom 0)]
(let [statement (element data)
act @*action*]
{:action act
:lvars @*lvars*
:truth (check-truth-value @*truth*)
:budget (check-budget @*budget* act)
:statement statement
:terms (terms statement)}))
act @*task-type*]
{:task-type act
:lvars @*lvars*
:truth (check-truth-value @*truth*)
:budget (check-budget @*budget* act)
:statement statement
:tense @*tense*
:syntactic-complexity @*syntactic-complexity*
:terms (terms statement)}))
data)))