2012-05-07 93 views
2

我在编写Prolog中一个相对简单的谓词时遇到了一些麻烦。这个谓词应该以小时:分钟的格式接收两个参数,计算两者之间的差异并检查该值是大于还是等于40分钟。计算Prolog中的时间差异

这是我到目前为止有:

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。

任何帮助,将不胜感激!

回答

2

你有两个问题。 第一个问题是您正在使用=:=/2,它测试两个数值表达式的计算结果是否相同,但您使用的是结构而不是数字表达式。

它还看来你的逻辑是不完全正确的(最后一句是没有意义的,你从第一次的时间减去分钟)

+0

提示:相反的是哟说(>)/ 2确实评估,只有(@>)/ 2不评估。检查:http://www.swi-prolog.org/man/arith.html –

+0

你是对的。修复答案 – gusbro

+0

感谢您的帮助! –