编写一个prolog规则来计算每个城市’;s高度(米)

编写一个prolog规则来计算每个城市’;s高度(米),prolog,Prolog,编写一条序言规则,以米为单位计算每个城市的海拔高度。请注意,以米为单位的高度可以计算为0.3048*以英尺为单位的高度 i、 例如,定义新的谓词:城市高度米(城市、州、英尺、米):- 我已经尝试了以下方法: 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_altitud

编写一条序言规则,以米为单位计算每个城市的海拔高度。请注意,以米为单位的高度可以计算为0.3048*以英尺为单位的高度

i、 例如,定义新的谓词:城市高度米(城市、州、英尺、米):-

我已经尝试了以下方法:

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)的输出。

Prolog谓词在向前和向后工作时是最好的,因此让我们从您的
f_to_m/2
谓词开始,并从中删除任何方向的概念:

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.
现在,您可以在两个方向上转换英尺和米。我们正在检查哪些输入是变量,以确保使用正确的规则,如果两个输入都是变量,我们将失败

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

city_altitude_in_meters(City, State, Feet, Meters):-
    city_altitude(City, State, Feet), % for when City or State are variables
    feet_meters(Feet, Meters).
通过这种方式,您甚至可以查询:

?- city_altitude_in_meters(City, State, Feet, 79.248).

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

两条注释/提示。1) 变量必须以大写字母开头(或
\uu
,但这与此处无关)。2) 在
city\u altitude\u In\u meters
中,您必须添加与城市、其状态和高度的一些连接。为什么不将切割替换为显式
var(米)、nonvar(英尺)
guards?那么
var(英尺)、var(米)
的情况如何?当前
?-英尺(X,Y)。
没有解决方案-实例化错误会更有帮助。显然,nonvar/nonvar情况也需要处理。
nonvar
保护是防止每个规则抛出错误所需的最低要求,也可以处理两个参数都是
nonvar
的情况。切口防止在预期使用期间留下不必要的选择点,但防护装置确保意外使用不会失败。两个变量都是
vars
的情况没有合理的解决方案,因为我们在无限范围内,在这种情况下,它只是失败了,但抛出一个错误是明智的。我使用了一个cut来模拟
(->;-)
语法,而不需要解释它。