2011-05-13 60 views
0

比較數字我沒能解決這個具有挑戰性的問題:製作列表,搜索......而在序言

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 = [插孔,丹尼爾]

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

謝謝。

+0

你已經接受了答案;沒有必要編輯你的問題,並用「我的問題已被回答」這個短語替換它。你應該保留你的問題完整的供其他人看到。 – LittleBobbyTables 2011-05-13 14:19:01

回答

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)應該失敗,因爲jackdanielmath並且得分高於45nameGrade(X, math, 70)應該返回[],因爲沒有人拿math的得分高於70

+0

是的,你的名字上有錯誤 – dark 2011-05-13 10:59:40

+0

是的,如果nameGrade(X,數學,70)實際上有一個錯誤,而不是70,它可以是20.所以它返回[jack,daniel] :)但我認爲jack ,數學,45是正確的,因爲傑克的成績超過45分。 – dark 2011-05-13 11:09:29

+0

它可能是但是沒有用盡的搜索,謂詞並不試圖找到滿足條件的所有組合。如果nameGrade([jack],math,45)失敗,但nameGrade([jack,daniel],math,45)成功,謂詞將更有意義。 – pad 2011-05-13 11:18:10