首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个prolog规则来计算每个城市的海拔高度(以米为单位

编写一个prolog规则来计算每个城市的海拔高度(以米为单位
EN

Stack Overflow用户
提问于 2019-09-11 03:42:58
回答 1查看 113关注 0票数 0

写一个Prolog规则来计算每个城市的海拔高度(米)。请注意,以米为单位的高度可以计算为0.3048 *以英尺为单位的高度。

即定义新的predicate:city_altitude_in_meters(城市、州、英尺、米):

我已经尝试过以下几种方法:

代码语言:javascript
复制
f_to_m(F_altitude,M_altitude):-
   M_altitude is (F_altitude)*0.3048.

city_altitude_in_meters(city, state,F_altitude, M_altitude):-
   (M_altitude is(F_altitude)*0.3048).

city_altitude(tempe, az, 1318).
city_altitude(atlanta, ga, 894).
city_altitude(chicago, il, 583).
city_altitude(denver, co, 5280).
city_altitude(seattle, wa, 260).
city_altitude(boise, id, 2704).
city_altitude(saltlakecity, ut, 4226).

我期望(tempe,az,1318,401.726)的输出。

EN

回答 1

Stack Overflow用户

发布于 2019-09-12 20:49:38

f_to_m/2谓词在向前和向后工作时是最好的,所以让我们从Prolog谓词开始,去掉它中任何方向的概念:

代码语言:javascript
复制
feet_meters(Feet, Meters) :-
    nonvar(Feet), !,  % Cut so second rule isn't used if nonvar(Feet)
    Meters is Feet*0.3048.
feet_meters(Feet, Meters) :-
    nonvar(Meters),
    Feet is round(Meters/0.3048). % rounded because computers and floating point arithmetic headaches, plus all your altitudes in feet are integers.

现在您可以在英尺和米之间进行双向转换。我们正在检查哪些输入是变量,以确保我们使用了正确的规则,如果两个输入都是变量,我们就会失败。

然后,您只需将此转换谓词应用于城市:

代码语言:javascript
复制
city_altitude_in_meters(City, State, Feet, Meters):-
    city_altitude(City, State, Feet), % for when City or State are variables
    feet_meters(Feet, Meters).

通过这种方式,您甚至可以查询:

代码语言:javascript
复制
?- city_altitude_in_meters(City, State, Feet, 79.248).

在编写Prolog时,考虑在两个方向上运行它,并使用所有变量组合,包括上面示例中的最坏情况查询,这总是一个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57877292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档