以下事实以这种格式表示票房前十的电影
%% 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).
- 定义一个规则,只返回所有电影的标题。
- 定义一个规则,只返回所有电影的明星。
- 定义一个规则,返回具有相同类型的电影的标题。
- 定义一个规则,基于票房比较两个电影的标题。
我目前的解决方案是:
domainss=symbolpredicatesnondeterm 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,_,_).goalstar(X).
我尝试解决最后两个问题,但我不知道该怎么做…
- 定义一个规则,返回具有相同类型的电影的标题。
- 定义一个规则,基于票房比较两个电影的标题。
回答:
定义一个规则,只返回所有电影的标题
title(X):-movie(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 grosscompare_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.