2017-01-08 51 views
0

下面的關於none_of_manufacturer的Datalog規則旨在 列出那些航空公司沒有飛機的飛機制造商在其船隊 列表中。然而,下面的Datalog的片段並不完成它打算做的事情。我需要基於兩個表創建一個Datalog Query?

 
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。我們最終的結果是相同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

您的期望是什麼?閱讀你的規則,我會認爲none_of_manufacturer(Man)的價值是{波音,空客,MD}。 – CoronA

+0

基本上,它意味着返回沒有平原的製造商,所以只需MD。 – user3255780

回答

0

你已經解決了自己的問題,但解釋正因如此,你的原始查詢沒有工作:

none_of_manufacturer(Man) :- 
    aircraft_type(Model, Man, _), 
    !model_in_fleet(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, _). 
+0

感謝馬丁分配。你的權利,你的看起來更清潔。再次感謝您的輸入 – user3255780

+0

@ user3255780:[回答「接受」時的含義是什麼?](http://stackoverflow.com/help/accepted-answer) – Holger

相關問題