Как исключить из пролога все страны, у которых есть флаг с основным цветом? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть следующий набор фактов по прологу:

primary(red).
primary(blue).
primary(yellow).  

flag(france,red).    
flag(france,blue).    
flag(france,white).     

flag(china,red).    
flag(china,white).    

flag(india,orange).    
flag(india,green).    
flag(india,white).    

Я хочу запустить запрос, чтобы получить список стран, чей флаг не содержит основного цвета вообще . В случае моей программы она должна возвращать только india .

Я попробовал следующий код, но он не сработал:

?- flag(X,Y),not(primary(Y)).   

X = france,    
Y = white ;    
X = china,    
Y = white ;    
X = india,    
Y = orange ;    
X = india,    
Y = green ;    
X = india,    
Y = white.    

Проблема в результате в том, что флаг Франции содержит основной цвет. Но он возвращается во Францию, потому что у него также есть неосновной цвет флага. так обстоит дело с Китаем. Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

В опубликованном вами запросе задается что-то вроде «цвета флага каких стран не являются основными?». Как вы заметили, это не совсем то, что вам нужно.

Если вы хотите использовать отрицание, вы должны сначала express точно предикат, который вы затем хотите отрицать. Вы просите «страны, флаг которых не содержит основного цвета». Итак, давайте сначала express понятие «страны, флаг которых содержит основной цвет»!

country_primarycolor(Country, Color) :-
    flag(Country, Color),
    primary(Color).

Посмотрим, делает ли это то, что мы хотим:

?- country_primarycolor(Country, Color).
Country = france,
Color = red ;
Country = france,
Color = blue ;
Country = china,
Color = red ;
false.

Для следующего шага нам также необходимо express понятие «страна». Это просто:

country(france).
country(china).
country(india).

А теперь страны, флаг которых не содержит основных цветов:

?- country(Country), not(country_primarycolor(Country, _Color)).
Country = india.
0 голосов
/ 27 мая 2020

Способ, которым Prolog отвечает на запрос, не позволяет вам этого сделать. Каким бы ни был запрос, Prolog будет go просматривать список предикатов один за другим. С вашими предикатами Prolog не может узнать, является ли flag(china,white) (например) последним, приписывающим цвет китайскому флагу, поэтому вы не можете выбрать флаги, которые не имеют специфику c color.

Способ go решить эту проблему - использовать список для хранения цветов флага:

flag(france,[red,blue,white]).    

flag(china,[red,white]).  

flag(india,[orange,green,white]).

Таким образом, Prolog просто go через список, чтобы узнать, есть ли основной цвет или нет.

Вот пример функции, которая делает то, что вы хотите:

no_primary_color(X,[]).
no_primary_color(X,[C|Cs]) :- not(primary(C)),no_primary_color(X,Cs).

И запрос:

?- flag(X,Y), no_primary_color(X,Y).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...