Prolog在比较与数据过滤中的应用

Prolog在比较与数据过滤中的应用,prolog,artificial-intelligence,Prolog,Artificial Intelligence,以下事实代表了这种格式的十大票房电影 %% 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_bu

以下事实代表了这种格式的十大票房电影

%% 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).
我试图解决最后两点,但我不知道如何

  • 定义返回具有相同类型电影标题的规则
  • 定义一个规则,该规则基于 真恶心
定义一个仅返回所有电影标题的规则

片名(X):-电影(X、、

实际上,该谓词返回电影的一个标题,但作为生成器,它会多次返回。返回所有这些元素或生成它们之间有很大的区别

定义一个规则,该规则根据总票房在两个电影片名之间进行比较

“比较规则”是什么意思?它应该初始化排序类型,如()或(=)-
compare\u gross
?或者它应该初始化元素的最大值
max\u 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
        )
    ),
    !.

谢谢你,你有好的prolog源代码吗,我使用的是visualprolog
?- 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.