根据我对prolog的了解,我对如何处理这个家庭作业项目感到有些茫然(不可否认,这不是很多)
基本上,我们有一群食客将他们的偏好排在某个菜上。为了方便起见,我们将菜肴命名为A,B,C,D和E
目标是根据用户选择的内容在桌子上分配座位,所以如果diner1的排名为[A,E,D,C,B],他将坐在靠近Diner2的地方。 [E,C,A,B,D]因为排名相似。
每个菜肴都有一个分数值,并将根据菜单中的菜肴位置乘以一个修饰符。
我知道我需要一个Diners列表(它们本身就是列表),我将需要根据将根据菜肴排名计算的分数对该列表进行排序。排序列表将按递减顺序输出(顶部最高分)
我的问题是,我如何根据prologs数学函数计算分数,以及如何将Diner与分数相关联,然后根据分数对Diners列表进行排序?此外,是否可以在一个查询中执行此操作?
提前谢谢
答案 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
当然,这是一个很糟糕的假设。无论如何,我希望它有所帮助!