Constraints are predicates in the body of the rule that produces true and false values. Constraints can be equalities, inequalities, and string checks such as containment and string matching.
Constraint contains(string1, string2) is used to check if the latter string contains the former string.
.decl stringTable(t:symbol)
.decl substringTable(t:symbol)
.decl outputData(substr:symbol, str:symbol)
.output outputData
outputData(x,y) :- substringTable(x), stringTable(y), contains(x,y).
stringTable("aaaa").
stringTable("abba").
stringTable("bcab").
stringTable("bdab").
substringTable("a").
substringTable("ab").
substringTable("cab").
The output would be:
a aaaa
a abba
a bcab
a bdab
ab abba
ab bcab
ab bdab
cab bcab
Constraint match is used to check if the latter string matches a wildcard pattern specified in the former string.
.decl inputData(t:symbol)
.decl outputData(t:symbol)
.output outputData
outputData(x) :- inputData(x), match("a.*",x).
inputData("aaaa").
inputData("abba").
inputData("bcab").
inputData("bdab").
The output would be:
aaaa
abba
Soufflé supports inequalities and equalities, i.e., >, <, =, !=, >= and <=. Examples of this are given below.
A(a,c) :- a > c.
B(a,c) :- a < c.
C(a,c) :- a = c.
D(a,c) :- a != c.
E(a,c) :- a <= c.
F(a,c) :- a >= c.
Syntax
In the following, we define constraints and argument values in Soufflé more formally using syntax diagrams and EBNF. The syntax diagrams were produced with Bottlecaps.
Constraint
A constraint is a predicate in the body of a rule. It either produces a true or a false value. Constraints can be inequalities and equalities for primitive types, and there are string constraints for matching and containment ship.
constraint ::= argument ( '<' | '>' | '<=' | '>=' | '=' | '!=' ) argument
| ( 'match' | 'contains' ) '(' argument ',' argument ')'
| 'true'
| 'false'