2

我编写了以下程序来验证“S”指定的学生是否在他的所有科目中都获得了“A”级。在这里,我知道只有当搜索树中的所有路径都被评估为“A”级时,我才能给出输出“真”。如果学生没有通过削减谓词获得“A”级,我能够实现。但是当所有路径都被搜索到时,真的没有得到如何指定它评估为 true 的谓词。

grade(123,'CSE1','A').
grade(123,'DIC','A').
grade(123,'ML','A').
grade(123,'PL','A').
grade(123,'CVIP','A').
grade(1234,'CSE1','A').
grade(1234,'DIC','A').
grade(1234,'ML','A').
grade(1234,'PL','B').
grade(1234,'CVIP','B').

honor(S):-grade(S,_,Y),not(Y='A'),!,false.
4

2 回答 2

2
于 2012-12-09T17:04:34.173 回答
0

有两种方法可以得到上述问题的答案: 1.首先使用 Capellic 指定的 setof。

honor(S) :-
   setof(S, C^G^(grade(S,C,G), \+ (grade(S,_,G2), G2 \= 'A')), Ss),
   member(S, Ss).

2.不使用setof:

ismember(S):-grade(S,_,Y),!.
honor(S) :- ismember(S),\+ (grade(S,_,Y), Y \= 'A').
于 2012-12-10T05:40:04.363 回答