使用列表和谓词在prolog中发出运行查询

使用列表和谓词在prolog中发出运行查询,prolog,logic,Prolog,Logic,目前正试图在prolog中为大学作业创建一个图书馆推荐系统,由于我对prolog非常陌生,我很迷茫,想知道是否可以详细解释其中的一些内容。 以下是我目前的事实和规则: book(after_dark, haruki_murakami,fiction,182). book(python, charlie, revision, 560). book(nt_bible, sams, reference, 480). book(monty_python, cleese, comedy, 300). b

目前正试图在prolog中为大学作业创建一个图书馆推荐系统,由于我对prolog非常陌生,我很迷茫,想知道是否可以详细解释其中的一些内容。 以下是我目前的事实和规则:

book(after_dark, haruki_murakami,fiction,182).
book(python, charlie, revision, 560).
book(nt_bible, sams, reference, 480).
book(monty_python, cleese, comedy, 300).

buildLibrary(Lib) :- findall(book(Title, Author, Genre, Size), book(Title, Author,
Genre, Size), Lib).

holiday(B,L) :- //this should take the list formed in buildLibrary along with a variable that represents a book 
                //and is true if and only if its genre is comedy or fiction and less than 400 pages
预期投入:

建筑图书馆(L)
假日(书(黑暗后,村上春树,小说,182),L)

理想情况下,这应该返回true,因为它满足概述的要求


我如何着手制定假期规则?一旦我知道如何做到这一点,我觉得我可以让它工作,我尝试了多种方法,他们都返回了SWL prolog中的错误,再次感谢任何帮助

如果我正确理解了您的实现,那么您可以执行以下操作:

holiday(B,L) :- buildLibrary(Lib), check(L,B).


check(book(X, Y, Genre, Size),[book(X, Y, Genre, Size)|_]):-
                    (Genre = comedy ;Genre = fiction), Size < 400.
check(B,[book(_, _, Genre, Size)|T]):-
                     dif(Genre,comedy),dif(Genre,fiction), check(B,T).
假日(B,L):-buildLibrary(Lib),check(L,B)。 检查(书籍(X,Y,类型,大小),[书籍(X,Y,类型,大小)| |]:- (体裁=喜剧;体裁=小说),尺寸<400。 勾选(B,[书(u,u,类型,大小)| T]):- dif(类型,喜剧),dif(类型,小说),检查(B,T)。
我的讲师在作业中指出:“你的假期、修订、文学和休闲谓词应该包含两个参数:一个“查询”书(标题和作者未知(可变)和一个图书馆(图书列表)。如果列表开头的书是适当类型的书(在这种情况下,它会将图书馆书的标题和作者与“查询”书匹配),它将遍历列表并计算为true。但是,我不知道如何表示“查询”作为一个规则。你能发布一个关于假日谓词的输入-预期输出的例子吗?更新了我的问题,希望这能让它更清楚。这听起来很愚蠢,所以如果是的话,我道歉。当我在swl prolog中运行查询时,当我使用
holiday(B,L)
谓词时,我是否可以设置
B=book(黑暗之后,村上春树,小说,182)
?所以它看起来像:
holiday(书(黑暗之后,村上春树,小说,182),L)
当然,像B=book(…),holiday(B,L)。。。一点也不愚蠢!!