I am writing a Souffle query that operates on family relationships:
.decl Parent(x: symbol, y: symbol)
.input Parent
.decl Descendant(x: symbol, y: symbol)
.output Descendant
.printsize Descendant
Descendant(x, y) :- Parent(x, y).
Descendant(x, y) :- Parent(z, y), Descendant(x, z).
.decl Qslow(x: symbol)
.output Qslow
.printsize Qslow
Qslow(x) :- Descendant("Alice", x).
I have some facts in a TSV file Parent.facts:
"Alice" "john"
"john" "mary"
"mary" "elizabeth"
"Bob" "charles"
And running souffle seems to generate the right output for the Descendant relation (three descendants for "Alice"):
hickory% souffle -F. -D. descendants.dl
Descendant 7
Qslow 0
hickory%
However, Qslow produces zero results. I would instead expect three results. This makes me suspicious of the definition of Qslow, but I am not sure what the issue is. Am I doing something weird with symbol syntax? It looks like I am using the same syntax as in the docs.
If I try adding another clause to the conjunction, I still get zero results:
Qslow(x) :- Descendant(y, x), y="Alice".
You have specified the file
Parent.factsin the wrong data format. It should bewithout double quotes and tabs to separate elements of tuples. Only facts in the program use double-quotes.