File size: 2,787 Bytes
0c77d6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
=======
no-body
=======

predicate foo();

mod::Type foo(int arg, Foo arg);

---

(ql
  (moduleMember (classlessPredicate (predicate) (predicateName) (empty)))
  (moduleMember (classlessPredicate (typeExpr (moduleExpr (simpleId)) (className)) (predicateName)
    (varDecl (typeExpr (primitiveType)) (varName (simpleId))) (varDecl (typeExpr (className)) (varName (simpleId))) (empty))))

================
simple predicate
================

predicate foo(F f){
  f = f
}

int predicateWithResult(){
  result = 43
}

---

 (ql
    (moduleMember (classlessPredicate (predicate) (predicateName) (varDecl (typeExpr (className)) (varName (simpleId))) (body
      (comp_term (variable (varName (simpleId))) (compop) (variable (varName (simpleId)))))))
    (moduleMember (classlessPredicate (typeExpr (primitiveType)) (predicateName) (body
      (comp_term (variable (result)) (compop) (literal (integer)))))))

=====================
higher-order relation
=====================

int foo(X x, Y y) = name(pred1/1, pred2/3)(x.x(), result)

---

(ql (moduleMember
  (classlessPredicate
    (typeExpr (primitiveType))
    (predicateName)
    (varDecl (typeExpr (className)) (varName (simpleId)))
    (varDecl (typeExpr (className)) (varName (simpleId)))
    (higherOrderTerm (literalId)
      (predicateExpr (aritylessPredicateExpr (literalId)) (integer))
      (predicateExpr (aritylessPredicateExpr (literalId)) (integer))
      (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))
      (variable (result))))))

===============
predicate alias
===============

predicate foo = somePredicate/12;

---

(ql (moduleMember (classlessPredicate
  (predicate)
  (predicateName) (predicateAliasBody (predicateExpr (aritylessPredicateExpr (literalId)) (integer))))))

==========
type union
==========

newtype T =
  T1() or
  T2(int x) { x = 1 or x = 2 } or
  T3(int x) { x = 3 or x = 4 or x = 5 }

class T2orT3 = T2 or T3;

---

(ql (moduleMember (datatype (className) (datatypeBranches
      (datatypeBranch (className))
      (datatypeBranch (className) (varDecl (typeExpr (primitiveType)) (varName (simpleId))) (body (disjunction
        (comp_term (variable (varName (simpleId))) (compop) (literal (integer)))
        (comp_term (variable (varName (simpleId))) (compop) (literal (integer))))))
      (datatypeBranch (className) (varDecl (typeExpr (primitiveType)) (varName (simpleId))) (body (disjunction (disjunction
        (comp_term (variable (varName (simpleId))) (compop) (literal (integer)))
        (comp_term (variable (varName (simpleId))) (compop) (literal (integer))))
        (comp_term (variable (varName (simpleId))) (compop) (literal (integer)))))))))
    (moduleMember (dataclass (className) (typeUnionBody (typeExpr (className)) (typeExpr (className))))))