summaryrefslogtreecommitdiff
path: root/examples/godis-tram/Common/Prolog.gf
blob: 461ed470e1c005a534209d5c96ff880c2207156d (plain)
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
resource Prolog = {

oper

PStr       : Type = {s : Str};
PPStr      : Type = PStr -> PStr;
PPPStr     : Type = PStr -> PStr -> PStr;
PPPPStr    : Type = PStr -> PStr -> PStr -> PStr;
PPPPPStr   : Type = PStr -> PStr -> PStr -> PStr -> PStr;
PPPPPPStr  : Type = PStr -> PStr -> PStr -> PStr -> PStr -> PStr;
PPPPPPPStr : Type = PStr -> PStr -> PStr -> PStr -> PStr -> PStr -> PStr;

pStr     : Str -> PStr   = \str   -> {s = str};
pOper    : Str -> PPPStr = \f,x,y -> pStr (x.s ++ f ++ y.s);
pPrefix  : Str -> PPStr  = \f,x   -> pStr (f ++ x.s);
pPostfix : Str -> PPStr  = \f,x   -> pStr (x.s ++ f);
pEmbed   : Str -> Str -> PPStr = \f,g,x -> pStr (f ++ x.s ++ g);
pParen   : PPStr = pEmbed "(" ")";
pBrackets: PPStr = pEmbed "[" "]";

pAtom   : PPStr = \x -> pStr ("'" + x.s + "'");
pQuote  : PPStr = pEmbed "'" "'";
pDQuote : PPStr = pEmbed "\"" "\"";

pNil   : PStr = pStr "''";
pEmpty : PStr = pStr [];

pp0 : Str -> PStr       = pStr;
pp1 : Str -> PPStr      = \pred,arg -> pPrefix pred (pParen arg);
pp2 : Str -> PPPStr     = \pred,arg1,arg2 -> pp1 pred (pSeq arg1 arg2);
pp3 : Str -> PPPPStr    = \pred,arg1,arg2 -> pp2 pred (pSeq arg1 arg2);
pp4 : Str -> PPPPPStr   = \pred,arg1,arg2 -> pp3 pred (pSeq arg1 arg2);
pp5 : Str -> PPPPPPStr  = \pred,arg1,arg2 -> pp4 pred (pSeq arg1 arg2);
pp6 : Str -> PPPPPPPStr = \pred,arg1,arg2 -> pp5 pred (pSeq arg1 arg2);

pList0  : PStr       = pBrackets pEmpty;
pList1  : PPStr      = \x -> pBrackets x;
pList2  : PPPStr     = \x,y -> pList1 (pSeq x y);
pList3  : PPPPStr    = \x,y -> pList2 (pSeq x y);
pList4  : PPPPPStr   = \x,y -> pList3 (pSeq x y);
pList5  : PPPPPPStr  = \x,y -> pList4 (pSeq x y);
pList6  : PPPPPPPStr = \x,y -> pList5 (pSeq x y);

pSeq    : PPPStr   = pOper ",";

pConcat : PPPStr   = \x,y -> pStr (x.s ++ y.s);

-- the following operations are Godis-specific

pWhQ : Str -> PStr  = \pred -> pOper "^" pVar (pp1 pred pVar);
pVar : PStr = pStr "X";

pm1 : PPStr      = \x -> x;
pm2 : PPPStr     = \x,y -> pm1 (pSeq x y);
pm3 : PPPPStr    = \x,y -> pm2 (pSeq x y);
pm4 : PPPPPStr   = \x,y -> pm3 (pSeq x y);
pm5 : PPPPPPStr  = \x,y -> pm4 (pSeq x y);
pm6 : PPPPPPPStr = \x,y -> pm5 (pSeq x y);

}