PASPProc.jl
3.12 KB
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
module PASPProc
include("../asplang/ASPLang.jl")
using ASPLang
export tree_string,
filter_tree,
filter_children,
has_child,
node_findreplace,
has_annotation_P,
repl_annotation_disjunction,
derived
tree_string(node::AnonymousVariable; level=0, indent="\t") = "$(indent^level)Anonymous: $(node.args |> string)"
tree_string(node::Functor; level=0, indent="\t") = "$(indent^level)Functor: $(node.args |> string)"
tree_string(node::Annotation; level=0, indent="\t") = "$(indent^level)Annotation: $(node.args |> string)"
tree_string(node::Variable; level=0, indent="\t") = "$(indent^level)Variable: $(node.args |> string)"
tree_string(node::StringConstant; level=0, indent="\t") = "$(indent^level)String: $(node.args |> string)"
tree_string(node::SymbolicConstant; level=0, indent="\t") = "$(indent^level)Symbol: $(node.args |> string)"
tree_string(node::NumberConstant; level=0, indent="\t") = "$(indent^level)Number: $(node.args |> string)"
#tree_print(node::Terminal; level=0, indent="\t") = node |> typeof |> string
function tree_string(node::ASPLang.NonTerminal; level=0, indent="\t")
node_head = node |> typeof |> string
sub_results = [ "$(indent^level)$node_head" ]
if isa(node.args, AbstractArray) && length(node.args) > 0
for child in node.args
child_tree = if isa(child, ASPLang.Node)
tree_string(child, level = level + 1, indent=indent)
else
"$(indent^(level+1))$(child |> string)"
end
push!(sub_results, child_tree)
end
else
push!(sub_results, tree_string(node.args, level=level+1, indent=indent))
end
join(sub_results, "\n")
end
tree_string(node; level=0, indent="\t") = "$(indent^level)$(node |> typeof |> string):$(node |> string)"
function filter_tree(node::NonTerminal, prop)
results = if prop(node)
[node]
else
[]
end
if isa(node.args, AbstractArray)
for d in node.args
append!(results, filter_tree(d, prop))
end
else
if prop(node.args)
push!(results, node.args)
end
end
results
end
function filter_children(node::NonTerminal, prop)
if isa(node.args, AbstractArray)
filter(prop, node.args)
else
if prop(node.args)
node.args
else
nothing
end
end
end
function has_child(prop)
node::NonTerminal -> any(prop, node.args)
end
function node_findreplace(node::NonTerminal, prop, action)
if prop(node)
action(node)
elseif isa(node.args, AbstractArray)
new_args = []
for arg in node.args
push!(new_args, node_findreplace(arg, prop, action))
end
typeof(node)(new_args)
else
node
end
end
has_annotation_P = n -> has_child(isa(n, ASPLang.Annotation))
function repl_annotation_disjunction(n::NonTerminal)
a = [xi for xi in n.args if !isa(xi, Annotation)][1]
Head(
Disjunction(
[a, Negated(a)]
))
end
function derived(p::ASPLang.Program)
node_findreplace(p,
has_annotation_P,
repl_annotation_disjunction)
end
end # PASPproc