我有这样的数据库:
movie(matrix,wachowski,thriller).
movie(terminator, cameron, thriller).
movie(Gladiator, scott, costume).
movie(star wars, lucas, fantasy).
movie(star trek, abrams, fantasy).
我想知道除了艾布拉姆斯以外谁是直接幻想电影。 我想我需要使用' not'谓词,但我不确切知道它是如何工作的。
?- movie(X,not(abrams),fantasy).
但不幸的是它没有用。
还有一个问题是什么样的电影不是惊悚片:
?- movie(X,_,not(thriller)).
仍然无法正常工作。
下一个问题是我需要使用基于bagof的谓词direct(Director, listsOfMovie)
。
?- direct(Director, listsOfMovie) :- bagof(Director,movie(Director,listsOfMovie,_), listsOfMovie).
仍然没有成功:(
任何人都可以提供帮助吗?
答案 0 :(得分:0)
使用not
你不能像函数一样使用Prolog谓词。 not/1
是一个谓词,它接受一个查询作为参数。所以这不符合您的想法:
movie(X,not(abrams),fantasy).
这是使用movie
的第二个参数查询not(abrams)
。您没有任何与movie(_, not(_), _)
匹配的事实或谓词,因此它始终会失败。
如果你想知道哪部电影不是惊悚片,你可以渲染一下:
movie(X, _, Type),
Type \= thriller.`
使用not
,可能是:
not( movie(X, _, thriller) ).
如果您希望movie(_, not(_), _)
的语法有效,可以为它编写谓词:
movie( Name, not(Director), Type ) :-
movie(Name, D, Type),
D \= Director.
现在我们有一个与表单匹配的事实或谓词头movie(_, not(_), _)
,然后查询movie(X, not(abrams), Y)
就可以了。但通常不是这样做的。
使用bagof/3
让我们来看看你对bagof
的使用。在最简单的情况下,bagof
应该采用三个参数:
bagof(X, {query involving X}, ListOfSatisfingXs)
因此,bagof
将运行 {查询涉及X} 生成每个X
,使其成为现实,创建ListOfSatisfingXs
,这是一个独特的排序列表X
的实例化。换句话说,ListOfSatisfingXs
是X
的唯一排序值,可使{query involving X}
成功。
在你的情况下,你已经把bagof
的论点搞砸了一下:
direct(Director, listsOfMovie) :-
bagof(Director, movie(Director, listsOfMovie, _), listsOfMovie).
在这里,您将Director
参数重用为bagof
参数,这是不好的(因为它不是预期的)。由于您正在寻找电影列表,因此第一个参数应代表电影。您对movie
的查询正在使用listsOfMovie
,您的目标参数用于保存列表结果,而不应该这样。最后,listsOfMovie
是一个原子,而不是一个变量,因为它不是以大写字母开头。
更正后的版本为:
director_movies(Director, ListOfMovies) :-
bagof(Movie, movie(Director, Movie, _), ListOfMovies).
此处,bagof
获取Movie
值的*唯一排序列表,以使movie(Director, Movie, _)
为真,并在ListOfMovies
中提供结果列表。