我需要根据两个表创建一个Datalog Query?

时间:2017-01-08 21:28:59

标签: datalog

以下针对none_of_manufacturer的数据记录规则旨在实现 列出航空公司没有飞机的飞机制造商 它的舰队。但是,下面的Datalog片段并没有做到这一点 打算这样做。

none_of_manufacturer(Man) :- aircraft_type(Model, Man, _),
¬ model_in_fleet(Model).
model_in_fleet(Model) :- aircraft(_, Model, _).

我可以对上述查询做些什么来修复它?

我想到了一个建议:

none_of_manufacturer(Man) :- aircraft_type(Model, Man, _),
¬ model_in_fleet(Model, Man).
model_in_fleet(Model, Man) :- aircraft(_, Model, _), aircraft_type(_ ,Man, _).

你们觉得怎么样?我附上了下表

        aircraft
---------------------------      
|  reg  |  model  |  miles  |  
|---------------------------|
|G-CWQS |737-400C | 2945321 |
|G-FDWC |737-400  | 506834  |
|G-FXDC |737-400  | 34760   |
|G-KLSD |737-400  | 590     |
|G-UGHJ |380      | 4544    |
-----------------------------
            aircraft_type
-------------------------------------
|model   | manufacturer|  no_engines |
-------------------------------------|
|727     | Boeing      |    3        |
|737-200 | Boeing      |    2        |
|737-400 | Boeing      |    2        |
|737-400C| Boeing      |    2        |
|737-500 | Boeing      |    2        |
|380     | Airbus      |    4        |
|747     | Boeing      |    4        |
|MD11    | MD          |    3        |
--------------------------------------

更新

我发现了一种可以解决问题的技术。考虑到原始查询返回了不在飞机表中的模型的制造,在这种情况下,对于以下缺失的飞机(727,737-200,737,500)和MD(MD11),Boing将是Boing。我们的最终结果是MD,因为我们没有MD平面,所以

Existing_manufacturer(Man):-aircraft_type(Model,Man,-),aircraft(_,Model,).
returns the manufacturer of existing planes Boing and Airbus.

Now if we were to use the previous query in the original

none_of_manufacturer(Man) :- aircraft_type(_ ,Man, _),
¬ Existing_manufacturer(Man).

Will calculate the difference and return only MD.

1 个答案:

答案 0 :(得分:0)

您已经解决了自己的问题,但要准确解释原始查询无效的原因:

none_of_manufacturer(Man) :-
   aircraft_type(Model, Man, _),
   !model_in_fleet(Model).

谓词将包含每个人,其中存在某些模型不属于舰队。

有趣的是,只有Model变量的存在才会引起这种混乱。为了避免这种情况,我总是非常明确地对事物进行建模,以便你的逻辑显然是正确的。

您在上面以更简单的形式写的规则是:

missing(Man) :-
   manufacturer(Man),
   !manufacturer_in_fleet(Man).

现在如何计算这些?

model_in_fleet(Model) :-
   aircraft(_, Model, _).

manufacturer_in_fleet(Man) :-
   aircraft_type(Model, Man, _),
   model_in_fleet(Model).

manufacturer(Man) :-
   aircraft_type(_, Man, _).