(ns patham
(:require [instaparse.core :as insta]
[clojure.core.contracts :as c])
(:gen-class)) | |
(def ETERNAL -100000) | |
type definitions | |
a truth value is a tuple (confidence,frequency) in (0,1)x[0,1] | (defn truth-inbound? [{:keys [confidence frequency]}]
(and (< 0 confidence 1)
(<= 0 frequency 1))) |
(defn truth? [M] (and (map? M)
(contains? M :confidence)
(contains? M :frequency)
(truth-inbound? M))) | |
a task is a term with a punctuation and occurrence time | (defn task? [t]
(and (map? t)
(contains? t :term)
(contains? t :occurrence)
(contains? t :punctuation))) |
a task is of type eternal if its occurrence time is eternal | (defn eternal? [t] (= (:occurrence t) ETERNAL)) |
a task is of type event if its occurrence time is not eternal | (defn event? [t] (not= (:occurrence t) ETERNAL)) |
truth expectation value in [0,1] calculated based on a truth value t | (defn expectation [t]
{pre [(truth? t)]}
{:post [#(<= 0 % 1)]}
(+ (* (:confidence t) (- (:frequency t) 0.5)) 0.5)) |
weight of evidence in [0,1] calculated from a number | (defn w2c [w]
{:pre [(number? t)]}
{:post [#(<= 0 % 1)]}
(/ w (+ w 1))) |
eternalize a event task to a task of eternal occurrence time | (defn eternalize [t]
{:pre [(event? t) (task? t)]}
{:post [eternal?, task? ]}
(assoc t :confidence (w2c (:confidence t))
:occurrence ETERNAL)) |
whether the task has question variables | (defn has-question-var [ref] false) |
the ranking value of the task t in regards to ref if it has question variables, the truth expectation matters, while when it has | (defn rank-value [ref t]
{:pre [(task? t)]}
{:post [number?]}
(if (has-question-var ref)
(:confidence t)
(expectation t))) |
temporally project task to ref task (note: this is only for event tasks!!)" | (defn project [t ref curtime]
{:pre [(task? t) (task? ref) (number? curtime)]}
{:post [#(and (task? %) (= (:occurrence %) (:occurrence ref)))]}
(let [sourcetime (:occurrence t)
targettime (:occurrence ref)
dist (fn [a b] (Math/abs (- a b)))]
(assoc t
:confidence (* (:confidence t)
(- 1 (/ (dist sourcetime targettime)
(+ (dist sourcetime curtime)
(dist targettime curtime)))))
:occurrence targettime))) |
temporally projecting/eternalizing a task to ref time | (defn project-eternalize [t ref curtime]
{:pre [(task? t) (task? ref) (number? curtime)]}
{:post [task?, #(= (:occurrence %) (:occurrence ref))]}
(let [source-time (:occurrence t)
target-time (:occurrence ref)
get-eternal (fn [x] (if (= x ETERNAL) :eternal :temporal))]
(case [(get-eternal target-time) (get-eternal source-time)]
[:eternal :eternal ] t
[:temporal :eternal ] t
[:eternal :temporal] (eternalize t)
[:temporal :temporal] (let [t-eternal (eternalize t)
t-project (project t ref curtime)]
(if (> (:confidence t-eternal)
(:confidence t-project))
t-eternal
t-project))))) |
rank a task according to a reference | (defn rank-task [ref curtime t]
{:pre [(task? ref) (task? t) (?number curtime)]}
{:task t
:value (rank-value ref (project-eternalize t ref curtime))}) |
get the best ranked table entry when ranked according to ref | (defn best-ranked [table ref curtime]
{:pre [(task? ref) (number? curtime)]
:post [task?]}
(apply max-key :value
(map (partial rank-task ref curtime) table))) |
whether the two evidental bases do not overlap | (defn non-overlapping-base? [t1 t2]
{:pre [(vector? t1) (vector? t2)]}
true) |
TODO revision | (defn revision [t1 t2]
{:pre [(task? t1) (task? t2)]}
t1) |
TODO add to table | (defn add-to-table [concept table x curtime]
;1 get best ranked one and revise with
(if (= (count (concept table)) 0)
(assoc concept table [x])
(let [best (best-ranked table {:occurrence curtime} curtime)
revised (revision x best)]
nil ;<- TODO))) |
add to belief table | (defn add-to-beliefs [concept x curtime] (add-to-table concept :beliefs x curtime)) |
add to desires table | (defn add-to-desires [concept x curtime] (add-to-table concept :desires x curtime)) |
Concept data structure | (defn buildConcept [name]
{:term name :beliefs [] :desires [] :tasklinks [] :termlinks []}) |
I don't do a whole lot ... yet. | (defn -main
[& args]
;((insta/parser (clojure.java.io/resource "narsese.bnf") :auto-whitespace :standard) "<bird --> swimmer>. %0.10;0.60%")
(do
(project-eternalize {:term "tim --> cat" :frequency 1 :confidence 0.75 :occurrence 10} {:term "tim --> cat" :frequency 1 :confidence 0.75 :occurrence 10} 100))
(print "lol")) |