Как написать правила для перечисления всех городов при запросе в запросе?

#prolog

#пролог

Вопрос:

Как установить правила и когда запрашивать запрос для перечисления всех городов, это работает?

 /*CITY DATABASE */
capital(bern).
capital(london).
capital(prague).
capital(bonn).
capital(belgrade).

city_in(prague,czechoslovakia).
city_in(berlin,germany).
city_in(hamburg,germany).
city_in(belgrade,yugoslavia).
city_in(bern,switzerland).
city_in(london,united_kingdom).

belongs_to(czechoslovakia,’COMECON’).
belongs_to(germany,’EC’).
belongs_to(switzerland,’EFTA’).
belongs_to(united_kingdom,’EC’).

/*END*/
  

Комментарии:

1. Не используйте теги языков, которые не задействованы.

2. Что вы уже пробовали?

3. Я не совсем понимаю вопрос, вы пытаетесь получить полный список доступных городов?

4. Это историческая база данных до 1993 года.

Ответ №1:

Чтобы получить полный список городов, доступных с этим набором правил, в следующем запросе будут перечислены все ваши города в переменной X (протестировано в SWI-Prolog):

 city_in(X, _).
  

Чтобы преобразовать города в единый список, используйте findall/3 ( Xs будет результат):

 findall(X, city_in(X, _), Xs).
  

Если вы пытаетесь получить список городов, принадлежащих какой-либо организации, вы можете выполнить следующее и получить список стран и городов, которые существуют в организации:

 belongs_to(Country, _), city_in(X, Country).
  

Опять же, для списка ответов с findall/3 :

 findall(X, (belongs_to(Country, _), city_in(X, Country)), Xs).
  

Список столичных городов, которые принадлежат некоторой организации (перечислены в переменной City):

 belongs_to(Country, _), city_in(City, Country), capital(City).
  

И для списка городов, принадлежащих организации с findall/3 :

 findall(City, (belongs_to(Country, _), city_in(City, Country), capital(City)), Cities).
  

Вывод из приведенного выше:

 ?- findall(City, (belongs_to(Country, _), city_in(City, Country), capital(City)), Cities).
Cities = [prague, bern, london].
  

Комментарии:

1. Эти запросы будут выдавать решения, но для объединения их в список вам нужно использовать setof/3 , bagof/3 или findall/3 .

2. Спасибо, Дэниел! Я попробую это и обновлю свой ответ, чтобы отразить это. Я сам все еще новичок в Prolog.

3. Ответ обновлен с использованием findall/3 для ответов на список.