将 PROLOG 输入与事实进行比较

Comparing PROLOG input to facts

假设我有一个 PROLOG 事实列表,它们是博客 Post 标题、作者和它们的写作年份:

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).

我想写一个包含两个 parameters/inputs、作者和年份的规则。如果作者在指定年份之后输入了一篇文章,PROLOG 将 return true。 这是我尝试过的:

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

所以如果我查询 ?- authoredAfter('author1',2010). PROLOG 会 return true 因为作者在 2010 年写了一篇文章。但是,如果我查询 ?- authoredAfter('author1',2009).,它会 return false,但是我想要return true 因为author1在那年之后写了一篇文章

我的问题是,如何将用户输入的值与事实值进行比较?

您需要使用两个不同的变量来表示文章的年份和您要开始搜索的年份并比较它们。像这样:

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

你表示 Author authoredAfter Year1 如果 Author 写的博客 post 在 Year2Year2 >= Year1.


如果您查询 author1 是否在 2009 年之后写过任何东西:

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

由于 author1 在 2009 年(2010 年、2011 年、2012 年)之后有 3 个博客 post,因此目标已实现三次。如果你想得到一个单一的答案,不管有多少这样的文章,你可以使用once/1:

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

?- authoredAfter(author1, 2009).
true.