Vous pouvez approximer le comportement d'une requête SQL (spécifique) de cette manière :
?- person(P),(favourite_icecream(P,I)->true;I='?'),(favourite_colour(P,C)->true;C='?').
P = john,
I = strawberry,
C = ? ;
P = jane,
I = choc_chip,
C = green ;
P = mike,
I = ?,
C = red.
Clairement, ce n'est pas une syntaxe très attrayante... elle pourrait être améliorée pour des cas d'utilisation spécifiques, mais l'effort de généralisation n'en vaut probablement pas la peine.
Comme Daniel l'a suggéré, l'esprit Prolog (orienté tuple) n'est pas le même que celui de SQL (orienté recordset).
modifier
Ma réponse a besoin d'une amélioration : disons qu'une personne a plus d'une préférence. Juste pour dire, changez le DB en
...
favourite_icecream(john,strawberry).
favourite_icecream(john,lemon).
...
La requête ci-dessus ne donnerait que la première préférence. En utilisant une méthode dite coupe douce au lieu de la si-alors-sinon nous pouvons mieux modéliser la jointure externe :
outer_join(P,I,C) :-
person(P),
(favourite_icecream(P,I)*->true;I='?'),
(favourite_colour(P,C)*->true;C='?').