以下针对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.
答案 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, _).