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
|
module
imports
statix/name
statix/util
signature
sorts constructors
Quoted : string -> Label
Unquoted : string -> Label
rules
: scope * Label
labelOK(s, Quoted(name)) :- declareLabel(s, name).
labelOK(s, Unquoted(name)) :- declareLabel(s, name).
rules // Label reusable predicates
: scope * string
declareLabel(, ) :-
s -> Label{name},
Label{name} in s |-> [(_, (_))] | error $[Duplicate definition of label [name]]@name.
resolveLabel : scope * string
resolveLabel(s, ) :- {}
Label{name} in s |-> paths,
resolveLabels(name, paths, NON_EMPTY()).
: string * list((path * occurrence)) * EMPTINESS
resolveLabels(, [(_, (Label{name'}))|labels], _) :-
@name.ref += name',
resolveLabels(name, labels, MAYBE_EMPTY()).
resolveLabels(, [], NON_EMPTY()) :- false | error $[Label [name] is not defined]@name.
resolveLabels(name, [], MAYBE_EMPTY()).
|