2012-04-23 39 views
0

,所以我有一組事實:SETOF/3和NAF

course(cs61, "intro to cs") 
... 
course(cs62b, "data structure") 
... 
grade(adam,  cs61, spring11, "A") 
... 
grade(chrisitian, cs61, fall2010, "A-") 

我需要定義一個謂詞good_standing(Student),以確定是否Student在他把每一個類有A。我必須用兩個不同的方法:

  1. 一號使用setof/3
  2. 使用NAF

。我試圖找出讓Result_list:一組學生,進行了一個從他抓住每一個類。然後致電member(Student, Result_list)。但我不知道該如何獲得Result_list,因爲語法對我來說有點奇怪。

+0

所以,規範的評論,[你有什麼嘗試](http://mattgemmell.com/2008/12/08/what-have-you-tried/)到目前爲止? – m09 2012-04-23 19:50:05

回答

1

1)對於NAF解決方案,您應該記住的是,良好的站立的學生是一個沒有等級低於A,即這樣一個沒有當然,他/她就和等級較低我們還要求這個人至少參加一門課程。

good_standing(Student) :- grade(Student, _,_,_), 
          \+ (grade(Student, Course, _, Grade), 
           lower(Grade,"A")). 

與等級之間的低/ 2定義關係:

lower("A-","A"). 
lower("B","A"). 
... 

如果學生獲得每場僅有一個級解決方案上面的工作。

2)對於SETOF解決方案,您可以找到每個學生的所有級別,並檢查它們是A.

grade(Student, Grade) :- grade(Student, _,_,Grade). 
good_standing(Student) :- setof(Grade, grade(Student,Grade), ["A"]). 

另外,通過的建議,我們可以使存在量化明確SETOF內:

good_standing(Student) :- setof(Grade, 
           Course^Period^grade(Student,Course,Period,Grade), 
           ["A"]). 
+0

'good_standing(學生): - SETOF(等級,當然^ ^年級(學生,課程,年份,等級),[ 「A」])' – false 2012-04-23 20:39:42

+0

謝謝!我將編輯我的答案以包含您的建議。 – 2012-04-23 20:52:33

+0

關於較低的「A」,它可能意味着不是「A」。因此,使用一個「for all」的否定式\ \ +(G,\ + P)' – false 2012-04-23 21:02:02