Определить правило, которое возвращает только все названия фильмов
название (X): - фильм (X, , _)
.
На самом деле, этот предикат возвращает один заголовок фильма, но в качестве генератора это делается много раз. Существует большая разница между возвратом всех таких элементов или их генерацией.
Определите правило, которое сравнивает между двумя названиями фильмов на основе брутто.
Что вы имели в виду "правило, которое сравнивает"? Он должен инициализировать тип заказа, например (<) или (>) или (==) - compare_gross
? Или он должен инициализировать максимум элементов max_gross
?
Наконец, мое решение:
%% movie(title , star, genre, gross)
movie(battle_los_angeles, aaron_eckhart, action, 13500000).
movie(rango, johnny_depp, animation, 51100000).
movie(red_riding_hood, amanda_seyfried, fantasy, 5300000).
movie(the_adjustment_bureau, matt_damon, sci_fi, 30400000).
movie(mars_needs_moms, seth_green, animation, 1700000).
movie(beastly, alex_pettyfer, romance, 13600000).
movie(hall_Pass, owen_wilson, comedy, 31300000).
movie(just_go_with_it, adam_sandler, comedy, 91200000).
movie(unknown, liam_neeson, thriller, 56000000).
movie(the_king_speech, colin_Firth, history, 126400000).
% Define a rule that only returns all the titles of movies.
titles( Titles ) :-
findall( X, movie( X, _, _, _), Titles ).
% Define a rule that only returns all the stars of movies.
stars( Stars ) :-
findall( X, movie( _, X, _, _), Stars ).
get_by_genre( Genre, Titles ) :-
findall( X, movie( X, _, Genre, _ ), Titles ).
% Define a rule that compares between two movie titles based on gross
compare_gross( Title1, Title2, Ans ) :-
movie( Title1, _, _, Gross1 ),
movie( Title2, _, _, Gross2 ),
compare( Ans, Gross1, Gross2 ).
max_gross( Title1, Title2, TitleMax ) :-
movie( Title1, _, _, Gross1 ),
movie( Title2, _, _, Gross2 ),
(
( Gross1 > Gross2
, TitleMax = Title1
)
;
( Gross1 =< Gross2
, TitleMax = Title2
)
),
!.
И у вас есть это
?- titles(X).
X = [battle_los_angeles, rango, red_riding_hood, the_adjustment_bureau, mars_needs_moms, beastly, hall_Pass, just_go_with_it, unknown|...].
?- stars(X).
X = [aaron_eckhart, johnny_depp, amanda_seyfried, matt_damon, seth_green, alex_pettyfer, owen_wilson, adam_sandler, liam_neeson|...].
?- get_by_genre( animation, X ).
X = [rango, mars_needs_moms].
?- compare_gross( rango, hall_Pass, Ans ).
Ans = (>).
?- max_gross( rango, hall_Pass, Ans ).
Ans = rango.