# Constraints

Arithmetic rules can be used to enforce modeling constraints. Many different types of constraints can be modeled, this page show a few of the common types.

For these examples, let `Foo` be the binary predicate that we wish to put constraints on. (Constraints are not limited to only binary predicates.)

## Functional

A Functional constraint enforces the condition that for each possible constant `c`, the values of all groundings of `Foo(A, c)` sum to exactly 1.

``````Foo(A, +c) = 1 .
``````

Note that the rule is unweighted (as indicated by the period at the end).

### Inverse Functional

Summing the first argument instead of the second one is often called Inverse Functional. There are no semantic differences between functional and inverse functional constraints.

``````Foo(+c, A) = 1 .
``````

## Partial Functional

A Partial Functional constraint is like a functional one, except the value of all groundings of `Foo(A, c)` sum to 1 or less.

``````Foo(A, +c) <= 1 .
``````

### Partial Inverse Functional

``````Foo(+c, A) <= 1 .
``````