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
signature
sorts constructors
SORT : occurrence -> TYPE
SEQ : TYPE * list(TYPE) -> TYPE
OPT : TYPE -> TYPE
: TYPE -> TYPE
ALT : TYPE * TYPE -> TYPE
: TYPE
: list(TYPE) * TYPE -> TYPE
: list(TYPE) * TYPE -> TYPE
: scope -> TYPE
relations
: occurrence -> TYPE
rules
: TYPE * list((path * (occurrence * TYPE)))
onlyOneOf(ty, [(_, (_, ty ))|ps]) :- noneOf(ty, ps).
onlyOneOf(ty, [(_, (_, ty'))|ps]) :- onlyOneOf(ty, ps).
onlyOneOf(ty, []) :- false.
: TYPE * list((path * (occurrence * TYPE)))
noneOf(ty, [(_, (_, ty ))|ps]) :- false.
noneOf(ty, [(_, (_, ty'))|ps]) :- noneOf(ty, ps).
noneOf(ty, []) :- true.
: list(TYPE) * list(TYPE) -> list(TYPE)
appendTypes([t|ts], types) = [t|appendTypes(ts, types)].
appendTypes([ ], types) = types.
: list(list(TYPE)) -> list(TYPE)
flattenTypes([ts|tts]) = appendTypes(ts, flattenTypes(tts)).
flattenTypes([ ]) = [].
|