2017-01-08 3 views
0

Die Datalog Regel unten für none_of_manufacturer war vorgesehen, diejenigen Flugzeughersteller aufzulisten, für die die Fluggesellschaft kein Flugzeug in ihre Flotte hat. Das Fragment von Datalog unten tut jedoch nicht, was es tun sollte.Ich muss eine Datalog-Abfrage basierend auf zwei Tabellen erstellen?

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

Was kann ich mit der obigen Abfrage tun, um es zu beheben?

dachte ich an einen Vorschlag:

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

Was denkt ihr? Ich habe die Tabellen im Anhang unter

 
     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  | 
-------------------------------------- 

aktualisieren

ich eine Technik entdeckt haben, die das Problem lösen könnte. In Anbetracht der ursprünglichen Abfrage zurückgegeben die Herstellung von Modellen nicht in der Flugzeug-Tabelle, die in diesem Fall wäre Boing für die folgenden fehlenden Flugzeuge (727.737-200737.500) und MD für (MD11). Unser höchstes Ergebnis MD als wir haben keine MD-Ebene so

 
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

Was sind Ihre Erwartungen? Wenn ich Ihre Regeln lese, würde ich erwarten, dass der Wert von none_of_manufacturer (Man) {Boeing, Airbus, MD} ist. – CoronA

+0

Grundsätzlich ist es gedacht, den Hersteller zurückzugeben, von dem es keine Ebenen hat, also nur MD. – user3255780

Antwort

0

Sie bereits Ihr eigenes Problem gelöst, aber genau zu erklären, warum Ihre ursprüngliche Abfrage nicht funktioniert:

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

Das Prädikat wird enthält jeden Mann, für den existiert einige Modell, das nicht in der Flotte ist.

Es ist interessant, dass nur das Vorhandensein der Modellvariablen diese Art von Verwirrung verursachen kann. Um das zu vermeiden, modelliere ich die Dinge immer sehr explizit, so dass Ihre Logik offensichtlich korrekt ist.

Die Regel, dass Sie wurden oben wären in einer einfacheren Form schreiben:

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

Nun, wie diejenigen berechnen?

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

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

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

Vielen Dank Martin. Dein Recht, deine sieht viel sauberer aus. Nochmals vielen Dank für Ihre Eingabe – user3255780

+0

@ user3255780: [Was bedeutet es, wenn eine Antwort "akzeptiert" ist?] (Http://stackoverflow.com/help/accepted-answer) – Holger

Verwandte Themen