什么是Prolog中的“外部联接”?

时间:2019-07-25 23:38:50

标签: prolog

说我有一个Prolog数据库

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

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

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

如何获得等效的外部联接以得到一系列结果,例如

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

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式估算(特定)SQL查询的行为:

?- 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.

显然,不是一个非常吸引人的语法...对于特定的用例来说可能会更好,但是归纳化的努力可能不值得。

如丹尼尔(Daniel)所言,Prolog思维方式(面向元组)与SQL(面向记录集)不同。

编辑

我的回答有待改进:假设一个人的喜好超过1个。只是说说,将数据库更改为

...
favourite_icecream(john,strawberry).
favourite_icecream(john,lemon).
...

上面的查询将仅产生第一个首选项。使用所谓的soft-cut而不是if-then-else,我们可以更好地为外部联接建模:

outer_join(P,I,C) :-
    person(P),
    (favourite_icecream(P,I)*->true;I='?'),
    (favourite_colour(P,C)*->true;C='?').