2017-03-12 55 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)].