Remove stale code

main
Eric Ihli 3 years ago
parent cd2c4268b7
commit 4433ca6ca5

@ -1,16 +0,0 @@
(ns example.real-estate
(:require [com.owoga.frp.infrastructure :as frp]))
(frp/defrelvar Offer
#(string? (:address %))
#(number? (:offer-price %))
#(inst? (:offer-date %))
#(string? (:bidder-name %))
#(string? (:bidder-address %)))
(frp/defrelvar Property
#(string? (:address %))
#(number? (:price %))
#(string? (:photo %))
#(string? (:agent-name %))
#(inst? (:date-registered %)))

@ -1,98 +0,0 @@
(ns com.owoga.frp.infrastructure
(:require [clojure.set :as set])
(:refer-clojure :exclude [extend]))
(defprotocol PRelVar
(extend [this extensions & constraints])
(restrict [this criteria & constraints])
(project [this attributes & constraints])
(product [this relvar & constraints])
(union [this relvar & constraints])
(intersection [this relvar & contstraints])
(difference [this relvar & constraints])
(join [this relvar & constraints])
(divide [this relvar & constraints])
(rename [this renames & constraints]))
(defprotocol PRelations
(load! [this relations])
(insert!
[this relation]
[this & relations])
(delete! [this & relations])
(update! [this old-relation new-relation])
(clear! [this]))
(declare extend-)
(declare project-)
(declare restrict-)
(deftype RelVar [relvar xf constraints]
PRelVar
(extend
[this extensions & constraints]
(extend- this extensions constraints))
(project
[this attributes & constraints]
(project- this attributes constraints))
(restrict
[this criteria & constraints]
(restrict- this criteria constraints))
clojure.lang.IDeref
(deref [_] (into #{} xf @relvar)))
(deftype BaseRelVar [relvar-name store constraints]
PRelVar
(extend
[this extensions & constraints]
(extend- this extensions constraints))
(project
[this attributes & constraints]
(project- this attributes constraints))
(restrict
[this criteria & constraints]
(restrict- this criteria constraints))
PRelations
(load! [this relations] (reset! store relations))
(insert!
[this relation]
(let [new-relation (conj @store relation)]
(run!
(fn [constraint]
(when (not (every? true? (constraint new-relation)))
(throw (ex-info "Constraint Exception" {}))))
constraints)
(reset! store new-relation)))
(insert!
[this & relations]
(let [new-relation (set/union @store (into #{} relations))]
(run!
(fn [constraint]
(when (not (every? true? (constraint new-relation)))
(throw (ex-info "Constraint Exception" {}))))
constraints)
(reset! store new-relation)))
clojure.lang.IDeref
(deref [_] @store))
(defn extend- [relvar extensions constraints]
(let [xf (map (fn [element]
(map (fn [[k f]]
(assoc element k (f element)))
extensions)))]
(->RelVar relvar xf constraints)))
(defn project- [relvar attributes constraints]
(->RelVar relvar (map #(select-keys % attributes)) constraints))
(defn restrict- [relvar criteria constraints]
(->RelVar relvar (filter criteria) constraints))
(def *constraints* (atom {}))
(defmacro defrelvar
[relvar-name & constraints]
(swap! *constraints* assoc-in [relvar-name :constraints] constraints)
`(->BaseRelVar '~relvar-name (atom #{}) [~@constraints]))

@ -1,360 +0,0 @@
(ns com.owoga.prhyme.frp
(:require [clojure.java.io :as io]
[clojure.string :as string]
[clojure.set :as set]
[com.owoga.prhyme.data.thesaurus :refer [thesaurus]]
[com.owoga.prhyme.core :as p]
[com.owoga.prhyme.util :as u]
[com.owoga.prhyme.syllabify :as s]))
(def dictionary
(line-seq (io/reader (io/resource "cmudict_SPHINX_40"))))
(def words (->> dictionary
(map u/prepare-word)
(map p/cmu->prhyme)))
(def popular-dict
(set (line-seq (io/reader (io/resource "popular.txt")))))
(def popular (filter #(get popular-dict (string/lower-case (:word %))) words))
(defn merge-phrase-words
"Given multiple `Word`, like the words for 'well off', create a single `Word`
that is syllabified as ('well' 'off') rather than as the combined ('weh'
'loff'). Useful for finding single-word rhymes of multiple-word targets.
An example: 'war on crime' -> 'turpentine'."
[phrase phrase-words]
(loop [merged (first phrase-words)
phrase-words (rest phrase-words)]
(cond
(and (empty? phrase-words) (empty? merged)) nil
(empty? phrase-words) (assoc merged :word phrase)
:else (recur (-> merged
(assoc :syllables (concat (:syllables merged)
(:syllables (first phrase-words))))
(assoc :syllable-count (+ (:syllable-count merged)
(:syllable-count (first phrase-words))))
(assoc :rimes (concat (:rimes merged)
(:rimes (first phrase-words))))
(assoc :onsets (concat (:onsets merged)
(:onsets (first phrase-words))))
(assoc :nuclei (concat (:nuclei merged)
(:nuclei (first phrase-words)))))
(rest phrase-words)))))
(defn partition-word [word]
(->> word
(:syllables)
(u/partitions)))
(defn rimes [words target]
(into #{}
(filter (fn [{:keys [rimes]}]
(= (last rimes) (last (:rimes target))))
words)))
(defn onsets [words target]
(into #{}
(filter (fn [{:keys [onsets]}]
(= (first onsets) (first (:onsets target))))
words)))
(defn nuclei [words target]
(into #{}
(filter (fn [{:keys [nuclei]}]
(= (last nuclei) (last (:nuclei target))))
words)))
(defn consecutive-matching
"Returns the consecutive matching rhymes of type.
Given words:
(D EY Z IY) and (K R EY Z IY)
the following would be returned for each type:
rimes: 2, (((IY) (IY)) ((EY) (EY))) - rimes are matched in reverse order
onsets: 0
nuclei: 2, (((EY) (EY)) ((IY) (IY))) - nuclei and onsets are matched in order
"
[a b type]
(let [a (if (#{:rimes :nuclei} type) (reverse (type a)) (type a))
b (if (#{:rimes :nuclei} type) (reverse (type b)) (type b))]
(take-while (fn [[x y]] (= x y)) (map list a b))))
(defn sort-rhymes
"Sorts by the number of consecutive matching rimes, onsets, and nuclei of each
word."
[rhymes word]
(sort (fn [a b]
(> (apply
+
(map #(count (consecutive-matching a word %))
[:rimes :onsets :nuclei]))
(apply
+
(map #(count (consecutive-matching b word %))
[:rimes :onsets :nuclei]))))
rhymes))
(defn prhyme
"Finds rhymes in dictionary `words` of `word` with options
to match on rimes, onsets, and/or nuclei."
[words word]
(let [r (if (:rimes? word) (rimes words word) #{})
o (if (:onsets? word) (onsets words word) #{})
n (if (:nuclei? word) (nuclei words word) #{})
all (set/union r o n)]
all))
(defn matching-syllable-count [n words]
(filter #(= n (:syllable-count %)) words))
(defn matching-synonyms [thesaurus target words]
(let [synonyms (get thesaurus target)]
(filter (fn [word] (some #(re-matches (re-pattern (str "(?i)" %)) (:word word)) synonyms))
words)))
(comment
(->> (p/cmu->prhyme ["foobar" "F" "UW" "B" "AA" "R"])
(#(assoc % :rimes? true))
(prhyme words)
(filter #(= (:syllable-count %) 2))
(sort-by #(count
(consecutive-matching
%
(p/cmu->prhyme ["foobar" "F" "UW" "B" "AA" "R"])
:rimes))))
(as-> (p/cmu->prhyme ["magic beam" "M" "AE" "J" "IH" "K" "B" "IY" "M"]) word
(into word {:rimes? true})
(prhyme popular word)
(mapcat #(matching-synonyms thesaurus % word)
["death" "evil" "satan" "devil" "sin" "bad" "hell"
"guts" "gore" "blood" "demon" "fear" "nightmare"
"distress" "corpse" "necrotic" "zombie"
"coma" "monster"]))
(as-> (p/cmu->prhyme ["please turn" "P" "L" "IH" "Z" "T" "ER" "N"]) word
(into word {:rimes? true})
(prhyme popular word)
(mapcat #(matching-synonyms thesaurus % word)
["death" "evil" "satan" "devil" "sin" "bad" "hell"
"guts" "gore" "blood" "demon" "fear" "nightmare"
"distress" "corpse" "necrotic" "zombie"
"coma" "monster"]))
)
(defn find-synonyms
([thesaurus dict word]
(find-synonyms thesaurus dict 1 #{word} #{}))
([thesaurus dict word degree]
(find-synonyms thesaurus dict degree #{word} #{}))
([thesaurus dict degree words synonyms]
(cond
(= degree 0) synonyms
(nil? (first words))
(recur thesaurus
dict
(dec degree)
(into #{} (map #(string/lower-case (:word %)) synonyms))
synonyms)
:else
(recur thesaurus
dict
degree
(rest words)
(set/union
synonyms
(let [synonyms (->> (get thesaurus (first words))
(map string/lower-case)
(into #{}))]
(->> dict
(filter #(synonyms (string/lower-case (:word %))))
(into #{}))))))))
(defn pprint-phrase [phrase-words]
(let [phrase-words (map #(if (empty? %) '("_") %) phrase-words)
max-len (apply max (map count phrase-words))
words-cycles (map cycle phrase-words)]
(->> (map (partial take max-len) words-cycles)
(apply map vector))))
(defn pprint-list [phrase-words]
(let [phrase-words (map #(if (empty? %) '("") %) phrase-words)
max-word-lens (->> phrase-words
(map #(map count %))
(map #(apply max %)))
max-rhyme-count (count (apply max-key count phrase-words))
fmt-strs (->> max-word-lens
(map #(+ 3 %))
(map #(format "%%-%ds" %)))
phrase-words (->> phrase-words
(map #(concat % (repeat "")))
(map #(take max-rhyme-count %))
(apply map vector)
(map (fn [words]
(->> (map vector fmt-strs words)
(map #(apply format %))))))]
phrase-words))
(defn pprint-table [phrase-words]
(let [phrase-words (map #(if (empty? %) '("") %) phrase-words)
max-word-lens (->> phrase-words
(map #(map count %))
(map #(apply max %)))
max-rhyme-count (count (apply max-key count phrase-words))
fmt-str (->> max-word-lens
(map #(+ 3 %))
(map #(format "%%-%ds" %))
(apply str))
phrase-words (->> phrase-words
(map #(concat % (repeat "")))
(map #(take max-rhyme-count %))
(apply map vector)
(map #(apply format fmt-str %))
(#(string/join "\n" %)))]
phrase-words))
(defn words->rhyme [dict words]
(->> words
(map #(into % {:rimes? true}))
(map (fn [target]
(->> (prhyme dict target)
(map #(assoc % :target target)))))
(map (fn [rhyming-words]
(filter #(= (:syllable-count %) (:syllable-count (:target %)))
rhyming-words)))
(map (fn [rhyming-words]
(let [target (:target (first rhyming-words))]
(sort-rhymes rhyming-words target))))
(map (fn [rhyming-words]
(map :word rhyming-words)))))
(defn prhyme-1 [dict targets]
(words->rhyme dict targets))
(defn prhyme-many [dict phrase]
(let [syllable-partitions
(->> phrase
(:syllables (p/phrase->word dict phrase))
(u/partitions)
(map (fn [part]
(map (fn [syllables]
(p/cmu->prhyme
(into
[(string/join " " (flatten (apply concat syllables)))]
(flatten syllables))))
part))))]
(map (partial prhyme-1 dict) syllable-partitions)))
(comment
(->> (prhyme-many popular "give him two lips like roses in clover")
(map (fn [rhymes]
(map #(take 20 %) rhymes)))
(map pprint-table)
(string/join "\n")
(println))
(let [phrase "give him two lips like roses in clover"
targets (->> phrase
(:syllables (phrase->word words phrase))
(u/partitions)
(first)
(map (fn [syllables]
(make-word
(into
[(string/join " " (flatten (apply concat syllables)))]
(flatten syllables))))))]
targets
(->> targets
(map #(into % {:rimes? true}))
(map (fn [target]
(->> (prhyme popular target)
(map #(assoc % :target target)))))
(map (fn [rhyming-words]
(filter #(= (:syllable-count %) (:syllable-count (:target %)))
rhyming-words)))
(map (fn [rhyming-words]
(let [target (:target (first rhyming-words))]
(sort-rhymes rhyming-words target))))
(map (fn [rhyming-words]
(map :word rhyming-words)))
(pprint-table)
(spit "rhymes.txt")))
(->> (phrase->word words "give")
(#(assoc % :rimes? true))
(prhyme popular))
(let [targets (map (partial phrase->word words)
(string/split
"give him two lips like roses in clover"
#" "))]
(->> targets
(map #(into % {:rimes? true}))
(map (fn [target]
(->> (prhyme popular target)
(map #(assoc % :target target)))))
(map (fn [rhyming-words]
(filter #(= (:syllable-count %) (:syllable-count (:target %)))
rhyming-words)))
(map (fn [rhyming-words]
(let [target (:target (first rhyming-words))]
(sort-rhymes rhyming-words target))))
(map (fn [rhyming-words]
(map :word rhyming-words)))
(pprint-table)
(spit "rhymes.txt")))
(let [targets (map (partial phrase->word words)
(string/split
"then tell him that his lonesome nights are over"
#" "))]
(->> targets
(map #(into % {:rimes? true}))
(map (fn [target]
(->> (prhyme popular target)
(map #(assoc % :target target)))))
(map (fn [rhyming-words]
(filter #(= (:syllable-count %) (:syllable-count (:target %)))
rhyming-words)))
(map (fn [rhyming-words]
(map :word rhyming-words)))
(pprint-table)
(spit "rhymes.txt")))
(let [targets (map (partial phrase->word words)
["please" "turn" "on" "your" "magic" "beam"])
synonyms (into #{} (->> (mapcat #(find-synonyms thesaurus words % 2)
["evil" "war" "death" "corpse"])
(map :word)))]
(->> targets
(map #(into % {:rimes? true}))
(map (fn [target]
(->> (prhyme popular target)
(map #(assoc % :target target)))))
(map (fn [rhyming-words]
(filter #(= (:syllable-count %) (:syllable-count (:target %)))
rhyming-words)))
(map (fn [rhyming-words]
(filter #(synonyms (:word %)) rhyming-words)))
(map (fn [rhyming-words]
(map :word rhyming-words)))
(pprint-table)
(spit "rhymes.txt")))
(s/syllabify ["IH" "N" "V" "AA" "L" "V" "Z"])
(s/syllabify ["D" "EH" "B" "Y" "AH"])
(s/syllabify ["R" "AW" "N" "D" "M" "IY" "HH" "AA" "R" "T"])
;; => (("R" "AW" "N" "D") ("M" "IY") ("HH" "AA" "R" "T"))
(s/syllabify ["P" "AE" "D" "M" "AY"])
(set/union (rimes words (make-word ["boat" "B" "OW" "T"]))
(onsets words (make-word ["ballboy" "D" "AH" "L" "B" "OY"]))))

@ -1,158 +0,0 @@
(ns com.owoga.prhyme.logic.core
(:refer-clojure :exclude [==])
(:require [clojure.core.logic.fd :as fd]
[clojure.string :as string]
[clojure.core.logic.pldb :as db]
[com.owoga.prhyme.data.dictionary :as dict]
[com.owoga.prhyme.syllabify :as syllabify])
(:use [clojure.core.logic]))
(defn productsumo [vars dens sum]
(fresh [vhead vtail dhead dtail product run-sum]
(conde
[(emptyo vars) (== sum 0)]
[(conso vhead vtail vars)
(conso dhead dtail dens)
(fd/* vhead dhead product)
(fd/+ product run-sum sum)
(productsumo vtail dtail run-sum)])))
(defn change [amount denoms]
(let [dens (sort > denoms)
vars (repeatedly (count dens) lvar)]
(run* [q]
(== q (zipmap dens vars))
(everyg #(fd/in % (fd/interval 0 amount)) vars)
(productsumo vars dens amount))))
(change 14 #{1 2 5 10})
(run* [s p o]
(membero s [:mother :child])
(membero o [:mother :child])
(membero p [:loves :has])
(!= s o))
(run* [s p o]
(everyg #(membero % [:mother :child])
[s o])
(membero p [:loves :has])
(distincto [s o]))
(def words-for-db dict/cmu-with-stress)
(defn phonemes-for-rhyme [word-phonemes]
(->> word-phonemes
reverse
(split-with #(re-matches #".*[^1]" %))
(#(concat (first %) (take 1 (second %))))))
(defn perfect-rhyme? [a b]
(= (phonemes-for-rhyme a)
(phonemes-for-rhyme b)))
(defn remove-consonants [w]
(remove #(re-matches #".*[^\d]" %) w))
(defn perfect-vowel-rhyme? [a b]
(= (remove-consonants (phonemes-for-rhyme a))
(remove-consonants (phonemes-for-rhyme b))))
(db/db-rel
word
^:index w
^:index syllable-count
^:index perfect-rhyme-phonemes)
(defn make-word [w]
[word
w
(->> w
rest
(map #(string/replace % #"\d" ""))
syllabify/syllabify
count)
(remove-consonants (phonemes-for-rhyme w))])
(remove-consonants (phonemes-for-rhyme ["po" "P" "AA1" "V" "ER0" "T" "IY0"]))
(def words
(apply
db/db
(map make-word words-for-db)))
(db/with-db words
(run 5 [sentence]
(fresh [w s p
w1 s1 p1]
(== p '("IY0" "OW1"))
(== sentence `(~w ~w1))
(fd/+ s s1 7)
(word w s p)
(word w1 s1 p1)
(== p p1)
(!= w w1))))
(db/db-rel test-word w)
(def test-db (db/db [test-word "hello"]
[test-word "world"]))
(db/with-db test-db
(run 5 [q]
(test-word q)))
(db/db-rel test-word w ^:index pos)
(def test-db (db/db [test-word "hello" :greeting]
[test-word "world" :noun]))
(db/with-db test-db
(run 5 [e a v]
(test-word "hello" a)))
(comment
(run* [q r]
(membero q ["linux" "windows" "mac" "android" ""])
(conda
[fail]
[(membero q ["linux" "windows"]) (== r 1)]
[(== q "mac") (== r 2)]
[succeed (== q "") (== r 3)]))
;; => (["linux" 1] ["windows" 1])
(run* [q r]
(conde
[fail]
[(membero q ["linux" "windows"]) (== r 1)]
[(== q "mac") (== r 2)]
[succeed (== q "") (== r 3)]))
;; => (["mac" 2] ["" 3] ["linux" 1] ["windows" 1])
(run* [q r]
(membero q ["linux" "windows" "mac" "android" ""])
(condu
[(membero q ["linux" "windows"]) (== r 1)]
[(== q "mac") (== r 2)]
[succeed (== q "") (== r 3)]))
;; => (["linux" 1] ["windows" 1] ["mac" 2] ["" 3])
(run* [q r]
(conde
[(membero q ["linux" "windows"]) (membero r ["iOS" "android"])]
[(== q "mac") (== r 2)]
[succeed (== q "") (== r 3)]))
;; => (["linux" "iOS"] ["linux" "android"] ["windows" "iOS"] ["windows" "android"])
(run* [q r]
(condu
[(== q "linux") (== r 1)]
[(membero q ["linux" "windows"]) (membero r ["iOS" "android"])]
[(== q "windows") (== r 2)]
[(== q "linux") (== r 3)]))
;; => (["linux" "iOS"] ["linux" "android"])
)
(let [people (repeatedly 5 lvar)
magazines (repeatedly 5 lvar)
cheeses (repeatedly 5 lvar)
reservations (repeatedly 5 lvar)
answers (map list people magazines cheeses reservations)]
(run* [q]
(== q answers)))
(run* [q]
(fd/in q (apply fd/domain (take 10 (iterate #(* % 2) 1)))))
Loading…
Cancel
Save