我无法解决这个具有挑战性的问题:
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。 (少一个)。
谢谢。
答案 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)
应该失败,因为jack
和daniel
都取math
并且分数高于45
。 nameGrade(X, math, 70)
应该返回[]
,因为没有人会将math
的得分高于70
。