SWI Prolog家庭作业协助

时间:2015-12-03 17:39:34

标签: sorting prolog

根据我对prolog的了解,我对如何处理这个家庭作业项目感到有些茫然(不可否认,这不是很多)

基本上,我们有一群食客将他们的偏好排在某个菜上。为了方便起见,我们将菜肴命名为A,B,C,D和E

目标是根据用户选择的内容在桌子上分配座位,所以如果diner1的排名为[A,E,D,C,B],他将坐在靠近Diner2的地方。 [E,C,A,B,D]因为排名相似。

每个菜肴都有一个分数值,并将根据菜单中的菜肴位置乘以一个修饰符。

我知道我需要一个Diners列表(它们本身就是列表),我将需要根据将根据菜肴排名计算的分数对该列表进行排序。排序列表将按递减顺序输出(顶部最高分)

我的问题是,我如何根据prologs数学函数计算分数,以及如何将Diner与分数相关联,然后根据分数对Diners列表进行排序?此外,是否可以在一个查询中执行此操作?

提前谢谢

1 个答案:

答案 0 :(得分:1)

好吧,我首先会创建一个包含每道菜得分的小型数据库:

u.dob = userInfo["dob"] as? String ?? ""

然后我设置位置系数:

dishScore(a, 5).
dishScore(b, 7.3).
% ...

现在,您已准备好编写谓词来评分排名:

coefficients([1, 0.8, 0.7, 0.4, 0.1]).

现在您需要对用餐者列表进行排序。用于执行此类操作的ISO谓词是scoreRanking(Ranking, Score) :- coefficients(Coeff), scoreRankingLoop(Ranking, Coeff, Score). scoreRankingLoop([], [], 0). scoreRankingLoop([Dish|Dishes], [C|Coeff], FinalScore) :- dishScore(Dish, DishScore), scoreRankingLoop(Dishes, Coeff, RemainingScore), MyScore is DishScore * C, FinalScore is RemainingScore + MyScore. ,其构思是您构建keysort/2项,其中X是键,Y是值,它在X上排序.SWI有自己的我们将使用的特殊谓词X-Y,因为它的工作量较少。

predsort/3

现在,您可以使用compareOnScore(Delta, Left, Right) :- scoreRanking(Left, LScore), scoreRanking(Right, RScore), compare(Delta, LScore, RScore). 作为参数调用predsort/3

compareOnScore

当然,这是一个很糟糕的假设。无论如何,我希望它有所帮助!