-
Notifications
You must be signed in to change notification settings - Fork 0
/
KnowledgeBase.jl
131 lines (116 loc) · 2.88 KB
/
KnowledgeBase.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# ================================ Adding Clauses to KB
function tell(kb::KnowledgeBase, clauses::Array)
if length(clauses) == 0
return true
end
clauses = remove_duplicates(clauses)
if exists_in_kb(kb, clauses) return false end
append!(kb.clauses, [(length(kb.clauses)+1, clauses)])
return true
end
function tell_cnf_terms(kb, arr)
for i in arr
if i.op == orTok
c = internalize_negation(i.args)
tell(kb, c)
elseif is_relation(i)
tell(kb, [i])
elseif i.op == notTok
c = internalize_negation(i.args[1])
tell(kb, [c])
elseif i.op == andTok
#or_args = [x for x in c if x.op == "|"]
ind = findall(x->x.op=="|", i.args)
ind_and = findall(x->x.op!="|", i.args)
tell_cnf_terms(kb, i.args[ind])
for c in ind_and
tell(kb, [i.args[c]])
end
else
tell(kb, [i.args[1]])
tell_cnf_terms(kb, i.args[2:end])
end
end
end
function internalize_negation(c::Clause)
c.negated = true
return c
end
function internalize_negation(c)
for j=1:length(c)
if c[j].op == notTok
c[j] = c[j].args[1]
c[j].negated = true
end
end
return c
end
function remove_duplicates(arr)
no_dups = Array{Clause, 1}()
for i in arr
if !inArray(no_dups, i)
append!(no_dups, [i])
end
end
return no_dups
end
function exists_in_kb(kb, arr)
for i in kb.clauses
if allEqual(i[2], arr) return true end
end
return false
end
# ================================ Indexing KB Clauses
function find_all_relations(c)
return [x.op for x in c]
end
function look_for_relation(c, rel::String)
if typeof(c) == Array{Clause, 1}
if length(c) == 0
return false, nothing
else
f1, c1 = look_for_relation(c[1], rel)
f2, c2 = look_for_relation(c[2:end], rel)
if f1
return f1, c1
else
return f2, c2
end
end
elseif typeof(c) == Array{Any, 1}
return false, nothing
elseif c.op in OPS
return look_for_relation(c.args, rel)
else
if c.op == rel
return true, c
else
return look_for_relation(c.args, rel)
end
end
end
function index_clauses(kb::KnowledgeBase)
d = Dict()
for i in kb.clauses
all_rels = find_all_relations(i[2])
for j in all_rels
if !haskey(d, j)
d[j] = Array{Int32, 1}()
d["~"*j] = Array{Int32, 1}()
end
end
end
for key in keys(d)
for i=1:length(kb.clauses)
flag, c = look_for_relation(kb.clauses[i][2], key)
if flag
if !c.negated
append!(d[key], i)
else
append!(d["~"*key], i)
end
end
end
end
return d
end