======= no-body ======= predicate foo(); mod::Type foo(int arg, Foo arg); --- (ql (moduleMember (classlessPredicate (returnType (predicate)) (predicateName) (empty))) (moduleMember (classlessPredicate (returnType (typeExpr (moduleExpr (simpleId)) (className))) (predicateName) (varDecl (typeExpr (typeLiteral)) (varName (simpleId))) (varDecl (typeExpr (className)) (varName (simpleId))) (empty)))) ================ simple predicate ================ predicate foo(F f){ f = f } int predicateWithResult(){ result = 43 } --- (ql (moduleMember (classlessPredicate (returnType (predicate)) (predicateName) (varDecl (typeExpr (className)) (varName (simpleId))) (body (comp_term (variable (varName (simpleId))) (compop (eq)) (variable (varName (simpleId))))))) (moduleMember (classlessPredicate (returnType (typeExpr (typeLiteral))) (predicateName) (body (comp_term (variable (result)) (compop (eq)) (literal (integer))))))) ===================== higher-order relation ===================== int foo(X x, Y y) = name(pred1/1, pred2/3)(x.x(), result) --- (ql (moduleMember (classlessPredicate (returnType (typeExpr (typeLiteral))) (predicateName) (varDecl (typeExpr (className)) (varName (simpleId))) (varDecl (typeExpr (className)) (varName (simpleId))) (higherOrderTerm (eq) (literalId) (predicateExpr (aritylessPredicateExpr (literalId)) (slash) (integer)) (predicateExpr (aritylessPredicateExpr (literalId)) (slash) (integer)) (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (variable (result)))))) =============== predicate alias =============== predicate foo = somePredicate/12; --- (ql (moduleMember (classlessPredicate (returnType (predicate)) (predicateName) (predicateAliasBody (eq) (predicateExpr (aritylessPredicateExpr (literalId)) (slash) (integer))))))