0

以下针对 none_of_manufacturer 的 Datalog 规则旨在列出航空公司在其机队中没有飞机的那些飞机制造商。然而,下面的 Datalog 片段并没有做它打算做的事情。

none_of_manufacturer(Man) :- aircraft_type(Model, Man, _),
¬ model_in_fleet(模型)。
model_in_fleet(模型):- 飞机(_,模型,_)。

我可以对上述查询做些什么来解决它?

我想到了一个建议:

none_of_manufacturer(Man) :- aircraft_type(Model, Man, _),
¬ model_in_fleet(模型,人)。
model_in_fleet(模型,人):-飞机(_,模型,_),飞机类型(_,人,_)。

你们有什么感想?我附上了下表

        飞机
--------------------------      
| 注册 | 型号 | 英里 |  
|---------------------------|
|G-CWQS |737-400C | 2945321 |
|G-FDWC |737-400 | 506834 |
|G-FXDC |737-400 | 34760 |
|G-KLSD |737-400 | 590 |
|G-UGHJ |380 | 4544 |
-----------------------------------------
            飞机类型
-------------------------------------
|型号| 制造商| no_engines |
--------------------------------------|
|727 | 波音 | 3 |
|737-200 | 波音 | 2 |
|737-400 | 波音 | 2 |
|737-400C| 波音 | 2 |
|737-500 | 波音 | 2 |
|380 | 空客 | 4 |
|747 | 波音 | 4 |
|MD11 | 医学博士 | 3 |
--------------------------------------

更新

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

Existing_manufacturer(Man):-aircraft_type(Model,Man,-),aircraft(_,Model,)。
返回现有飞机波音和空客的制造商。

现在,如果我们要使用原始查询中的前一个查询

none_of_manufacturer(Man) :- aircraft_type(_ ,Man, _),
¬ Existing_manufacturer(人)。

将计算差异并仅返回 MD。
4

1 回答 1

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, _).
于 2017-01-09T05:29:02.780 回答