OK, so:
p([]).
… is a conjunction when considered as part of the program logic (because it is in the list of predicates in the program), and is a disjunction when considered at runtime (executable alternative).
A Programmer is naturally going to view it as a disjunction.
I view this conjunction vs disjunction as being different to a declarative vs procedural reading of the program:
- Declarative reading: Are constraints defined sufficiently
- Procedural reading: Will the program execute correctly, in a timely manner, without falling into infinite loops etc.