2017-01-08 4 views
0

none_of_manufacturerの以下のDatalogルールは、 航空会社に航空機が搭載されていない航空機メーカーのリストを としたものです。下のDatalogの断片は、 が意図したものではありません。2つのテーブルに基づいてデータログクエリを作成する必要がありますか?

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

これを修正するにはどうすればよいですか?

私は1つの提案を考えた:

 
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になります。

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

述語意志:私たちの最終的な結果は、あなたはすでに、独自の問題を解決したが、あなたの元のクエリが機能しなかった理由を詳しく説明するので、

 
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)の価値が{Boeing、Airbus、MD}と期待します。 – CoronA

+0

基本的には平野のないメーカーが返却されますので、ただMDです。 – user3255780

答えて

0

我々はMD面を持っていないとして、メリーランド存在するすべての人間を含む一部艦隊内に存在しないモデル。

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

関連する問題