2017-03-12 57 views
2

我正在用prolog分配一個問題。帶複合謂詞的集合

所以,我有以下事實數據庫序言:

student(name(doe, [john]), 33332, ['CSI1120']). 
student(name(doe, [jane]), 33336, ['CSI1120']). 

evaluation('CSI1120', homework(1), ['Prolog', database ], 5). 

mark('CSI1120', 33332, homework(1), 3.5). 
mark('CSI1120', 33336, homework(1), 4.0). 

我在這裏的目標是創建一個謂詞listAllMarks/3

?- returnAllMarks('CSI1120',homework(1),L). 

返回:

L= [(33332, 3.5), (33336, 4.0)]. 

在爲了解決這個問題,我正在考慮使用序言setof/3,所以我帶着以下謂詞來。

returnAllMarks(C,H,L):- setof(L,mark(C,_,H,X),[L|X]). 

這似乎不起作用,謂詞總是返回false。我懷疑這可能是由於我使用setof反對複合謂詞的事實,但我可能是錯的(我還處於學習序言的早期階段)。

你們有沒有想法?我看着從各個角度這個問題,我在這裏停留

謝謝

回答

2

你可以寫這樣的:。

returnAllMarks(C,H,L):- setof((X,Y), mark(C,X,H,Y), L). 

例子:

?- returnAllMarks('CSI1120',homework(1),L). 
L = [ (33332, 3.5), (33336, 4.0)].