2

我正在尝试为我从 mySql 转换为 Prolog 事实的数据库创建 Prolog 查询。

Prolog 事实涉及许多表,但与此查询相关的只有两个:

actor(ID,firstName,lastName)
film_actor(actor_id,film_id)
film(ID, title,_,_,_,_,_,_,_)

我正在尝试创建一个说明以下内容的查询:

列出恰好有 5 个演员的电影的标题。

到目前为止,我设法创建了这个查询,列出了我所有的电影以及该电影中每个演员的 ID:

all((T,AID),(film(FID,C,T,_,_,_,_,_,_),film_actor(AID,FID)),RS).

我需要的是计算这个 AID 并声明每个 film_id 必须等于 5 次出现但我不知道如何从我到目前为止阅读的 yap 文档中做到这一点。

有小费吗?

提前致谢

4

1 回答 1

1

您可以只使用 findall,后跟 length 将列表限制为 5 个元素,以获得一个电影 ID。

one_film_with_5_actors(FilmID,ActorIDs) :-
  findall(AID, (film(FilmID,_,_,_,_,_,_,_,_),film_actor(AID,FilmID)), ActorIDs),
  length(ActorIDs, 5).

Prolog 将返回每对(FilmID,ActorIDs)的回溯,然后将基本访问器应用到这个“分组”数据库视图以获得您需要的信息。

于 2018-10-14T13:34:54.970 回答