Пролог: сравнение диапазона времен

Краткое изложение, по сути, идея программы пролога (GNU Prolog) состоит в том, чтобы искать в базе данных, содержащей людей с доступными временными интервалами, по набору времени (время начала, время окончания) и возвращать первого человека, который может встретиться в это время. Вход имеет синтаксис

meeting(Person,slot(time(10,0),time(12,30)))

У меня есть предикат, который соответствует приведенному выше как таковой:

meeting(Person, slot(time(A,B),time(C,D))) :- %insert code

и записи в базе данных выглядят так:

free(george,slot(time(9,30),time(11,0)))

Я застрял в том, что я не уверен, как я могу сравнить время в базе данных со временем, введенным при вызове моего предиката собрания. Не ищу бесплатного ответа, просто хочу толкнуть в правильном направлении и хороший пример :) Всем спасибо!


person Jason McKindly    schedule 19.10.2013    source источник
comment
Вот что можно попробовать, и это можно использовать в качестве идеи в предикате: запустите свой gprolog, загрузите свои данные (free(...) элементов) и введите это: free( Person, slot(time(FromH, FromM), time(ToH, ToM))).. После каждого представленного решения нажмите ;.   -  person lurker    schedule 19.10.2013
comment
При этом я просто возвращаю первого человека в базе данных, и все. Я понимаю самые основы того, как работает пролог, чтобы знать, что он ищет первое совпадение с запросом, а затем назначает это совпадение переменной Person.   -  person Jason McKindly    schedule 19.10.2013
comment
Если у вас есть несколько записей в базе данных, он должен выдавать вам каждую запись по очереди, если вы нажмете ;, и для каждой записи вы получите Person, час времени начала (FromH), минуты времени (FromM) и т. Д. Для каждого совпадения. Если вы этого не поняли, значит, что-то не так. И суть упражнения в том, что если вы хотите сопоставить время, вы должны выполнять такой запрос, чтобы проверять каждый раз, когда оно находится в базе данных.   -  person lurker    schedule 19.10.2013
comment
Я получаю: meeting.pl:12-13: предупреждение: одноэлементные переменные [A, B, C, D, FromH, FromM, ToH, ToM] для встречи / 2 ann GNU Prolog 1.4.4 (64 бит) Скомпилировано 24 апреля 2013 г. , 16:00:30 с gcc Даниэль Диас Copyright (C) 1999-2013 Daniel Diaz | ? -; Когда я вхожу; Я просто получаю пустую строку и ничего не происходит   -  person Jason McKindly    schedule 19.10.2013
comment
Вы делаете что-то неправильно, потому что если я помещу вашу единственную строку данных в gprolog, а затем введу запрос, который я вам дал (free( Person, slot(time(FromH, FromM), time(ToH, ToM))).), тогда я получу следующие строки вывода: FromH = 9, FromM = 30, Person = george, ToH = 11 и ToM = 0, чего я и ожидал. Если у вас есть несколько элементов базы данных, будет представлено несколько решений.   -  person lurker    schedule 19.10.2013
comment
Вы правы, я использовал вместо 'при загрузке в файл .pl базы данных. Теперь он правильно читается   -  person Jason McKindly    schedule 19.10.2013


Ответы (1)


Выполняя то, что сказал mbratch, я лучше видел, как пролог проходит через базу данных, и я мог легко написать логику сравнения, которая удовлетворяла бы требованиям.

Идея в том, что, вызывая free (...), как указано выше, Person получает первого человека в списке, а все переданные переменные получают данные. Затем я мог бы использовать свою логику для данных, и если вся логика пройдет, метод выполнится и вернется правильный ответ.

Спасибо за вашу помощь!

person Jason McKindly    schedule 19.10.2013