Пролог в сравнении и фильтрации данных - PullRequest
1 голос
/ 30 октября 2011

Следующие факты представляют 10 лучших фильмов в кассах в этом формате

%% 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, comdey, 31300000). 
movie(just_go_with_it, adam_sandler, comedy, 91200000). 
movie(unknown, liam_neeson, thriller, 56000000). 
movie(the_king_speech, colin_Firth, history, 126400000). 
  • Определите правило, которое возвращает только все названия фильмов.
  • Определите правило, котороевозвращает только все звезды фильмов.
  • Определите правило, которое возвращает названия фильмов, имеющих одинаковый жанр.
  • Определите правило, которое сравнивает между двумя названиями фильмов на основе общего количества.*

    Мое решение до сих пор:

    domains
    s=symbol
    predicates
    nondeterm movie(s,s,s,integer)
    nondeterm title(s)
    nondeterm star(s)
    clauses 
    %% 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, comdey,31300000). 
    movie(just_go_with_it, adam_sandler, comedy, 91200000). 
    movie(unknown, liam_neeson, thriller, 56000000). 
    movie(the_king_speech, colin_Firth, history, 126400000). 
    title(X):-movie(X,_,_,_).
    star(X):-movie(_,X,_,_).
    
    goal
    star(X).
    

    Я пытался решить последние два пункта, но я не знаю, как ...

    • Определить правилокоторые возвращают названия фильмов, имеющих одинаковый жанр.
    • Определите правило, которое сравнивается между двумя названиями фильмов на основе общего количества.

1 Ответ

3 голосов
/ 30 октября 2011

Определить правило, которое возвращает только все названия фильмов

название (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.
...