首页 > 解决方案 > 在查询中询问时如何编写列出所有城市的规则?

问题描述

如何设置规则以及何时要求查询列出它工作的所有城市?

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

标签: prolog

解决方案


要获取此规则集可用的完整城市列表,以下查询将在 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].

推荐阅读