我在Prolog中编写一个相对简单的谓词时遇到了一些麻烦。该谓词应该以格式“小时:分钟”接收两个参数,计算两者之间的差异,并检查该值是否大于或等于40分钟。
这是我到目前为止所拥有的:
time(Time1, Time2):-
X:Y =:= Time1, A:B =:= Time2, calculate_time(X, Y, A, B).
calculate_time(X, Y, A, B):-
Y - X =:= 0,
B - A >= 40, !.
calculate_time(X, Y, A, B):-
Y - X > 0.
你可以想象,这是一个错误,即:
?- time(10:00, 10:55).
ERROR at clause 1 of user:time/2 !!
INSTANTIATION ERROR- in arithmetic: expected bound value
所以,据我所知,他认为他有四个论点。他为什么这样反应?此外,在文件的开头,我有以下命令:
:-op(500,xfy,:).
:-op(600,xfy,/).
这个谓词应该是更大程序的一部分,所以这两行必须留在文件中。我没有使用任何模块而且我正在使用YAP。
任何帮助将不胜感激!
答案 0 :(得分:2)
你有两个问题。
第一个是您正在使用=:=/2
来测试两个数值表达式的计算结果是否相同,但是您使用的是结构而不是数字表达式。
似乎你的逻辑也不完全正确(最后一句没有意义,你从第一次的小时数减去分钟数)
答案 1 :(得分:0)
如果时差大于或等于40分钟,则返回true。
程序:
time(A:B,X:Y):-
HOURS is X - A,
MINUTES is Y - B,
LENGTH is HOURS*60 + MINUTES,
LENGTH >= 40.
test1:
?- time(06:40,09:45).
true.
test2:
?- time2(09:40,09:45).
false.