#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
для ответов на список.