说我有一个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
答案 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='?').