我需要建立一个Prolog的谓词这Books2009返回发表在2009年的一年书单列出,并在Books2014,书出版于2014年序言 - 添加元素的递归谓词
setbooks:只会用于“创建”将在谓词booksList_2009_2014中使用的书籍列表。
booksList_2009_2014(L,Books2009,Books2014):这是我们试图创建和运行的谓词(“L”是先前在setbook中设置的书籍列表)。
我的代码解释:我试图让谓语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).
林不知道,但我想代码的心不是某个地方纠正递归代码:
当我键入setbooks(L ),booksList_2009_2014(L,Books2009,Books2014),该程序正在返回我刚刚列出的最后一本书。例如:
Books2009 = [book('Name 1', 'Publisher ABC', date(06, 2009))]
有人能帮助我吗? Pleeeasse ???
你能帮忙吗?当使用'books_of_year'时,出现错误''findall'中的自由变量只能在'findall'Book'内使用。不明白原因。 – Aliaxander 2016-12-04 23:34:15
@Aliaxander:也许你应该发表一个关于你的问题的问题。我不清楚细节,因为我从未见过这样的警告...... – CapelliC 2016-12-05 08:39:21