Yap Prolog - перевод SQL-запроса - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать запрос Prolog для базы данных, которую я перевел с mySql на факты 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 и указать состояние, которое должно быть равно 5 вхождениям для каждого film_id. Но я делаюне знаю, как это сделать из документации по трепу, которую я читал до сих пор.

Любые советы?

Заранее спасибо

1 Ответ

0 голосов
/ 14 октября 2018

Вы можете просто использовать findall, а затем длину, чтобы ограничить список до 5 элементов, чтобы получить один идентификатор фильма.

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

Prolog будет возвращаться при возврате каждой пары (FilmID, ActorID), затем применяет элементарные методы доступа к этому представлению DB сгруппированных по, чтобы получить необходимую информацию.

...