Мне нужно создать запрос журнала данных на основе двух таблиц?

Приведенное ниже правило журнала данных для none_of_manufacturer предназначено для перечисления тех производителей самолетов, для которых авиакомпания не имеет самолетов в своем парке. Однако приведенный ниже фрагмент журнала данных не делает того, для чего он был предназначен.

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

Обновлять

Я обнаружил метод, который может решить эту проблему. Учитывая, что исходный запрос вернул производство моделей, отсутствующих в таблице самолетов, которые в этом случае были бы Boing для следующих отсутствующих самолетов (727 737–200 737 500) и MD для (MD11). Наш конечный результат — 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.

person user3255780    schedule 08.01.2017    source источник
comment
Каковы ваши ожидания? Читая ваши правила, я ожидаю, что значение none_of_manufacturer(Man) будет {Boeing, Airbus, MD}.   -  person CoronA    schedule 09.01.2017
comment
По сути, он предназначен для возврата производителя, от которого у него нет равнин, поэтому просто MD.   -  person user3255780    schedule 09.01.2017


Ответы (1)


Вы уже решили свою проблему, но чтобы точно объяснить, почему ваш исходный запрос не сработал:

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, _).
person Martin Bravenboer    schedule 09.01.2017
comment
Большое спасибо, Мартин. Ваше право, ваш выглядит намного чище. Еще раз спасибо за ваш вклад - person user3255780; 09.01.2017
comment
@ user3255780: Что значит, когда ответ принят? - person Holger; 04.04.2017