不在Prolog和使用Bagof

时间:2014-11-22 13:24:13

标签: prolog

我有这样的数据库:

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

仍然没有成功:(

任何人都可以提供帮助吗?

1 个答案:

答案 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的实例化。换句话说,ListOfSatisfingXsX的唯一排序值,可使{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中提供结果列表。