制作清单,搜索和比较prolog中的数字

时间:2011-05-13 07:59:41

标签: prolog

我无法解决这个具有挑战性的问题:

name(jack, math, 50).
name(daniel, math, 60).
name(jane, phys, 70).
name(eto, comp, 73).

谓词:nameGrade(P, L, S). P是正在上课L并且成绩大于S的人员列表。

nameGrade([jack], math, 45).返回true

nameGrade([jack, daniel], math, 55).返回false。 (因为杰克得分50,小于55)

nameGrade([], phys, 80).返回true

nameGrade(X, math, 70).返回X = [jack,daniel]

nameGrade([jack, daniel], math, X).返回X = 50。 (少一个)。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用findall/3返回满足谓词的元素列表:

nameGrade(P, L, S) :- is_list(P), name(_, _, S), findall(X, (name(X, L, S0), S0 >= S), P).
nameGrade(P, L, S) :- number(S), findall(X, (name(X, L, S0), S0 >= S), P).

但是,您的要求中存在一些相互矛盾的目标。例如,nameGrade([jack], math, 45)应该失败,因为jackdaniel都取math并且分数高于45nameGrade(X, math, 70)应该返回[],因为没有人会将math的得分高于70