2015-01-05 3 views
0

Скажет, у меня есть список Пролог фактов, которые блог заголовков, автор и год они были написаны:Сравнение ПРОЛОГА ввода факты

blogpost('Title 1', 'author1' 2012). 
blogpost('Title 2', 'author1', 2011). 
blogpost('Title 3', 'author1' 2010). 
blogpost('Title 4', 'author1', 2006). 
blogpost('Title 5', 'author2' 2009). 
blogpost('Title 6', 'author2', 2011). 

Я хочу написать правило, которое имеет два параметра/входы, автор и год. Если введенный автором написал статью после указанного года, PROLOG вернет true. Вот что я пробовал:

authoredAfter(X,Z) :- 
    blogpost(_,X,Z), 

Так что, если я опрошен ?- authoredAfter('author1',2010). ПРОЛОГ вернется true потому, что автор написал статью в 2010 г. Однако, если я запрашиваю ?- authoredAfter('author1',2009)., он будет возвращать false, но я хочу его вернуть true, потому что автор1 написал статью после этого года.

Вопрос в том, как мне сравнить значение входного сигнала пользователя со значением в факте?

+1

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

+0

Спасибо, что пометили это, я написал его в SO сам, поскольку база данных для моей программы (курсовая работа университета) * намного больше и сложнее! –

ответ

0

Вам нужно два варианта использования двух разных переменных в течение года для статьи и за год, в который вы хотите начать поиск и сравнить их. Что-то вроде этого:

authoredAfter(Author, Year1):- 
    blogpost(_, Author, Year2), 
    Year2 >= Year1. 

Вы выражаете тот факт, что AuthorauthoredAfterYear1 если есть блог написан Author в Year2 и Year2 >= Year1.


Если вы выдаете запрос, чтобы увидеть, если author1 написал ничего после 2009 года:

?- authoredAfter(author1, 2009). 
true ; 
true ; 
true ; 
false. 

цель довольные три раза author1 имеет 3 сообщения в блоге после 2009 (2010, 2011, 2012). Если вы хотите, чтобы получить один ответ, независимо от того, как существуют много таких статей, вы можете использовать once/1:

authoredAfter(Author, Year1):- 
    once((blogpost(_, Author, Year2), 
      Year2 >= Year1)). 

?- authoredAfter(author1, 2009). 
true. 
+0

это прекрасно, спасибо! Также спасибо за дополнительные советы, я думаю, мне нужен только один ответ, но он может пригодиться позже (это курсовая работа в университете!) :) –

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