2012-05-07 2 views
2

У меня возникли проблемы с написанием относительно простого предиката в 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.

Любая помощь будет оценена!

ответ

2

У вас есть две проблемы. Первое, что вы используете =:=/2, который проверяет, соответствуют ли два числовых выражения одинаковым, но вы кормите его структурой вместо числовых выражений.

Также кажется, что ваша логика не совсем верно (последний пункт не имеет смысла, вы вычитая минуты от часов в первый раз)

+0

Подсказка: Вопреки тому, что года говорят (>)/2 оценивает, только (@>)/2 не оценивает. Проверьте: http://www.swi-prolog.org/man/arith.html –

+0

Вы правы. Исправлен ответ – gusbro

+0

Спасибо за помощь! –

Смежные вопросы