Skip to content


Most declarations in Dusa contain terms. Numbers (0, -213, 100), strings ("Hello world", "whatever?"), and constructors (a, b, f c, h (f d) a) are all terms. When you write edge a b in Dusa, both a and b get treated as constructors that take no arguments (we’ll usually call these “constants.“)


Rules in Dusa may contain logic variables, which start with uppercase letters. The following rule says the edge relation is symmetric:

edge X Y :- edge Y X.

If we have the fact edge a b, this rule will allow us to match Y = a and X = b in the premise, and then use the rule to derive the fact edge b a.

Each variable can only be assigned one value. This rule:

self X :- edge X X.

cannot make use of the fact edge a b, because there’s no way to assign X = a and X = b simultaneously. However, if we have the fact edge c c, then we can match X = c and derive the fact self c using this rule.

All the variables in the conclusion of a rule must appear in the premises.


You can use and reuse the wildcard _ in place of a variable you don’t care about. edge _ _ will match the fact edge a b and also the fact edge c c.

If you don’t care about a variable’s value, you can precede the variable name with a wildcard: edge _Left _Right treats the variables _Left and _Right like wildcards. A wildcard with a given name can only appear once in a rule. The only purpose for naming a wildcard is documentation and readability.