У вас есть недетерминированный c предикат starsin(X, Y)
если только mov ie X
включает в себя кинозвезду Y
.
Давайте обобщим это, чтобы сказать нам, какие звезды появляются в любом из список фильмов.
movies_starsin(Movies, Star) :-
member(Movie, Movies),
starsin(Movie, Star).
Наконец-то вы хотите что-то вроде этого:
movies_stars(Movies, Stars) :-
setof(Star, movies_starsin(Movies, Star), Stars).
Надеюсь, это поможет.
[ОБНОВЛЕНИЕ]
У меня было неправильно понял проблему, которая состоит в том, чтобы найти множество звезд, которые появляются в всех фильмах в данном списке. Хорошо:
starsin_all([Movie | Movies], Star) :-
% Star must appear in Movie.
starsin(Movie, Star),
% There can be no OtherMovie in which Star does not appear.
\+ (
member(OtherMovie, Movies),
\+ starsin(OtherMovie, Star)
).
all_starsin_all(Movies, Stars) :-
setof(Star, starsin_all(Movies, Star), Stars).
Вы могли бы эквивалентно написать starsin_all
, например:
starsin_all([Movie | Movies], Star) :-
starsin(Movie, Star),
forall(member(OtherMovie, Movies), starsin(OtherMovie, Star)).
Приветствия.