4 votes

Quel est l'équivalent d'une "jointure externe" en Prolog ?

Disons que j'ai une base de données Prolog

person(john).
person(jane).
person(mike).

favourite_icecream(john,strawberry).
favourite_icecream(jane,choc_chip).

favourite_colour(jane,green).
favourite_colour(mike,red).

Comment puis-je obtenir l'équivalent d'une jointure externe pour obtenir une série de résultats tels que

john, strawberry, _
jane, choc_chip, green
mike, _, red

3voto

CapelliC Points 30055

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='?').

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X