Вы можете настроить базу данных вин и их характеристик примерно так:
wine_color_body(chardonnay, white, light).
wine_color_body(gruener_veltliner, white, full).
wine_color_body(cabernet_franc, red, light).
wine_color_body(pinot_noir, red, medium).
wine_color_body(merlot, red, full).
(Вы будете знать о вине больше, чем я, и, возможно, добавите гораздо больше критериев.)
Затем вы можете сформулировать свои правила подсчета очков на основе индивидуальных характеристик следующим образом:
dish_wine_score(fish, Wine, 1) :-
wine_color_body(Wine, white, _).
dish_wine_score(fish, Wine, 0) :-
wine_color_body(Wine, red, _).
dish_wine_score(beef, Wine, 1) :-
wine_color_body(Wine, red, _).
dish_wine_score(beef, Wine, 0) :-
wine_color_body(Wine, white, _).
dish_wine_score(dessert, Wine, 2) :-
wine_color_body(Wine, _, light).
dish_wine_score(dessert, Wine, 1) :-
wine_color_body(Wine, _, medium).
dish_wine_score(dessert, Wine, 0) :-
wine_color_body(Wine, _, full).
Например, чтобы увидеть, что идет с fi sh:
?- dish_wine_score(fish, Wine, Score).
Wine = chardonnay,
Score = 1 ;
Wine = gruener_veltliner,
Score = 1 ;
Wine = cabernet_franc,
Score = 0 ;
Wine = pinot_noir,
Score = 0 ;
Wine = merlot,
Score = 0.
А затем вы можете легко получить оценку на основе списка блюд или их свойств:
dishes_wine_score([], _Wine, 0).
dishes_wine_score([Dish | Dishes], Wine, Score) :-
dish_wine_score(Dish, Wine, DishScore),
dishes_wine_score(Dishes, Wine, RestScore),
Score is DishScore + RestScore.
Какое вино go лучше всего будет с говядиной и десертом после этого?
?- dishes_wine_score([beef, dessert], Wine, Score).
Wine = cabernet_franc,
Score = 3 ;
Wine = pinot_noir,
Score = 2 ;
Wine = merlot,
Score = 1 ;
Wine = chardonnay,
Score = 2 ;
Wine = gruener_veltliner,
Score = 0.
Когда вы будете на этом этапе вам просто нужно собрать все эти ответы, отсортировать их и найти те, которые набрали наибольшее количество баллов. Вы можете сделать это с помощью bagof/3
или findall/3
, за которым следует sort/2
.