-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClause.jl
129 lines (116 loc) · 3.2 KB
/
Clause.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
# ================================ Equality Checks
function equal(e1, e2)
if typeof(e1) == Array{Any, 1} && typeof(e2) == Array{Any, 1}
return true
elseif typeof(e1) == Array{Clause, 1} && typeof(e2) == Array{Clause, 1}
if length(e1) == 0 && length(e2) == 0
return true
elseif length(e1) == 0 || length(e2) == 0
return false
else
return equal(e1[1], e2[1]) && equal(e1[2:end], e2[2:end])
end
elseif e1.op == e2.op
if length(e1.args) == length(e2.args) && (e1.negated == e2.negated)
return equal(e1.args, e2.args)
else
return false
end
else
return false
end
end
function inArray(a2, c::Clause)
for j in a2
if equal(c, j)
return true end
end
return false
end
function allEqual(a1::Array, a2::Array)
if length(a1) != length(a2) return false end
for i in a1
if inArray(a2, i)
continue
else
return false
end
end
for i in a2
if inArray(a1, i)
continue
else
return false
end
end
return true
end
# ================================ Deep Copying
# WARNING # TODO FIX
# DEEP COPIES ONLY VARIABLE & CONSTANT ARGS
function copyClause(c::Clause)
new_c = Clause(c.op)
new_c.negated = c.negated
for i in c.args
i_args = [copyClause(x) for x in i.args]
append!(new_c.args, Array{Clause, 1}([Clause(i.op, i_args, i.negated)]))
end
return new_c
end
function copyClause(c::Array)
new_arr = Array{Clause, 1}()
for i in c
append!(new_arr, Array{Clause, 1}([copyClause(i)]))
end
return new_arr
end
function copyClause(q::Quantifier)
new_q = Quantifier(q.op, q.var)
new_q.args = copyClause(q.args)
return new_q
end
# ================================ Conversion to Clause
function extract(symbol::String, arr::Array)
index = findall(x->x==symbol, arr)[1]
return arr[1:index-1], arr[index+1:end]
end
function toClause(item)
if typeof(item) == Clause || typeof(item) == Quantifier return item end
if length(item) == 0 return item end
# check for operators in the following precedence
# ==>, |, &, ~, strings and vars
if typeof(item) == String
return Clause(item, [])
end
if iffTok in item
l, r = extract(iffTok, item)
return Clause(iffTok, [l, r])
elseif impliesTok in item
l, r = extract(impliesTok, item)
return Clause(impliesTok, [l, r])
elseif forallTok in item
l, r = extract(forallTok, item)
return Quantifier(forallTok, r[1], toClause(r[2:end]))
elseif existsTok in item
l, r = extract(existsTok, item)
return Quantifier(existsTok, r[1], toClause(r[2:end]))
elseif impliesTok in item
l, r = extract(impliesTok, item)
return Clause(impliesTok, [l, r])
elseif orTok in item
l, r = extract(orTok, item)
return Clause(orTok, [l, r])
elseif andTok in item
l, r = extract(andTok, item)
return Clause(andTok, [l, r])
elseif notTok in item
l, r = extract(notTok, item)
return Clause(notTok, [r])
end
if length(item) == 1 && !(typeof(item) == Array{Any, 1})
return toClause(item)
elseif length(item) == 1
return toClause(item[1])
end
return Clause(string(item[1]), item[2:end][1])
end