Prolog通过给类打分进行分类

Prolog通过给类打分进行分类,prolog,classification,Prolog,Classification,我正在开发一个知识系统,当用户进入一道菜时,它可以返回一瓶葡萄酒。我的想法是根据用户的输入为每个葡萄酒类添加点数,然后显示最适合的3个葡萄酒类。例如,如果有人输入fish,那么知识库中的所有红葡萄酒都得零分,白葡萄酒得一分。如果用户随后输入一种SAU或蔬菜等。与此相匹配的葡萄酒会得到额外的分数。这将产生一个列表,根据积分显示哪些葡萄酒(在我的知识库中)最适合,哪些最不适合。有人知道我如何在prolog中做到这一点吗 您可以建立一个葡萄酒及其特性数据库,如下所示: wine_color_body(

我正在开发一个知识系统,当用户进入一道菜时,它可以返回一瓶葡萄酒。我的想法是根据用户的输入为每个葡萄酒类添加点数,然后显示最适合的3个葡萄酒类。例如,如果有人输入fish,那么知识库中的所有红葡萄酒都得零分,白葡萄酒得一分。如果用户随后输入一种SAU或蔬菜等。与此相匹配的葡萄酒会得到额外的分数。这将产生一个列表,根据积分显示哪些葡萄酒(在我的知识库中)最适合,哪些最不适合。有人知道我如何在prolog中做到这一点吗

您可以建立一个葡萄酒及其特性数据库,如下所示:

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).
(你对葡萄酒的了解会比我多,可能还会增加更多的标准。)

然后,您可以根据个人特征制定评分规则,如下所示:

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).
例如,要查看鱼的搭配:

?- 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.
什么酒最适合搭配牛肉和餐后甜点

?- 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

来实现这一点。老实说,我认为你已经对如何解决问题有了一个可操作的观点,这意味着你将与Prolog进行斗争,因为Prolog希望你告诉它你想要什么,让它知道如何解决。我总是从思考我掌握的事实以及如何最好地向Prolog提供这些事实开始这样的Prolog程序,然后,开始思考如何让他们参与到这个问题中来。他们想要的是一个葡萄酒、葡萄酒特性和葡萄酒评分之间关系的数据库。战斗开场白怎么样?@IsabelleNewbie我说的是分数分配和得分。谢谢你,Isabelle,这帮了大忙!你好你发送的代码非常有效!我还有一个问题。如果您询问葡萄酒的分数,某些葡萄酒可能会出现多次,但分数不同。我怎样才能解决这个问题?所以:菜、酒、分数(鱼、酒、分数)。给赤霞珠3法郎;黑比诺2号;赤霞珠;梅洛0;我在回答中给出了这个问题的答案,没有重复。另外,在我的程序中,fish的分数应该只有0或1。你一定是不知怎么改了密码,但我不知道怎么改的。如果你不明白,你可以问另一个问题。
bordeaux
zweigelt