【发布时间】:2014-09-11 19:08:43
【问题描述】:
我需要构建一个 Prolog 谓词,它在 Books2009 中返回 2009 年出版的书籍列表,在 Books2014 中返回 2014 年出版的书籍。
setbooks:将仅用于“创建”将在谓词 booksList_2009_2014 中使用的图书列表。
booksList_2009_2014(L, Books2009, Books2014):这是我们试图创建和运行的谓词(“L”是以前在 setbooks 中设置的书籍列表)。
我的代码解释:我尝试制作将插入元素的谓词insertAtEnd(稍后将在booksList_2009_2014中使用)在列表的末尾。
然后我写了谓词 booksList_2009_2014 用于最简单的情况(接收一个空的书籍列表),然后接收一个只有 1 个元素的书籍列表,然后,一个递归的情况可以完成这项工作不论多长的书单。
这是我的代码文件:
setbooks([book('Name 5', 'Publisher ABC', date(12, 2014)), book('Name 4', 'Publisher ABC', date(05, 2009)), book('Name 3', 'Publisher ABC', date(02, 2009)), book('Name 6', 'Publisher ABC', date(03, 2013)), book('Name 2', 'Publisher ABC', date(12, 2014)), book('Name 1', 'Publisher ABC', date(06, 2009))]).
insertAtEnd(X,[ ],[X]).
insertAtEnd(X,[H|T],[H|Z]) :- insertAtEnd(X,T,Z).
booksList_2009_2014([],_,_).
booksList_2009_2014([book(Name,Publisher,date(M1,Y1))],Books2009, Books2014):-
Y1=2014 -> insertAtEnd(book(Name,Publisher,date(M1,Y1)),_,Books2014);
Y1=2009 -> insertAtEnd(book(Name,Publisher,date(M1,Y1)),_,Books2009).
booksList_2009_2014([H|T],Books2009, Books2014):-
booksList_2009_2014(T,Books2009, Books2014).
我不确定,但我认为递归代码中某处的代码不正确:
booksList_2009_2014([H|T],Books2009, Books2014):-
booksList_2009_2014(T,Books2009, Books2014).
当我输入 setbooks(L),booksList_2009_2014(L,Books2009, Books2014) 时,程序只返回列表中的最后一本书。例如:
Books2009 = [book('Name 1', 'Publisher ABC', date(06, 2009))]
有人可以帮助我吗?拜托了???
【问题讨论】: