Классификация Пролога с присвоением баллов классам - PullRequest
2 голосов
/ 18 июня 2020

Я работаю над системой знаний, которая может возвращать вино, когда пользователь вводит di sh. Моя идея состоит в том, чтобы добавить баллы к каждому классу вина в зависимости от ввода пользователя, а затем отобразить 3 лучших подходящих класса вина. Так, например, если кто-то вводит fi sh, тогда все красные вина в базе знаний получают ноль баллов, а белые вина получают балл. Если пользователь затем вводит тип колбасы или овощей и т. Д. Соответствующие вина получают дополнительный балл. В результате будет составлен список, показывающий, какие вина (в моей базе знаний) подходят лучше всего, а какие - хуже всего по баллам. Кто-нибудь знает, как я мог это сделать в прологе.

1 Ответ

2 голосов
/ 18 июня 2020

Вы можете настроить базу данных вин и их характеристик примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...