带有复合谓词的 setof
setof with compound predicate
我正在为 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).
Returns:
L= [(33332, 3.5), (33336, 4.0)].
为了解决这个问题,我想利用序言setof/3
,所以我来了以下谓词。
returnAllMarks(C,H,L):- setof(L,mark(C,_,H,X),[L|X]).
这似乎不起作用,谓词总是 return 错误。我怀疑这可能是因为我对复合谓词使用了 setof,但我可能是错的(我仍处于学习序言的早期阶段)。
你们有什么想法吗?我从各个角度来看这个问题,卡在这里。
谢谢。
你可以这样写:
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)].
我正在为 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).
Returns:
L= [(33332, 3.5), (33336, 4.0)].
为了解决这个问题,我想利用序言setof/3
,所以我来了以下谓词。
returnAllMarks(C,H,L):- setof(L,mark(C,_,H,X),[L|X]).
这似乎不起作用,谓词总是 return 错误。我怀疑这可能是因为我对复合谓词使用了 setof,但我可能是错的(我仍处于学习序言的早期阶段)。
你们有什么想法吗?我从各个角度来看这个问题,卡在这里。
谢谢。
你可以这样写:
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)].