在prolog中的搜索树中搜索所有可能性时输出

在prolog中的搜索树中搜索所有可能性时输出,prolog,Prolog,我编写了以下程序,以验证“S”指定的学生是否在其所有科目中都获得了“A”级。在这里,我知道只有当搜索树中的所有路径都被评估为“A”级时,我才能给出输出“true”。如果一个学生没有通过断语获得“a”级,我就能达到这个目标。但是,当所有路径都被搜索时,真的不知道如何指定它计算为true的谓词 grade(123,'CSE1','A'). grade(123,'DIC','A'). grade(123,'ML','A'). grade(123,'PL','A'). grade(123,'CVIP',

我编写了以下程序,以验证“S”指定的学生是否在其所有科目中都获得了“A”级。在这里,我知道只有当搜索树中的所有路径都被评估为“A”级时,我才能给出输出“true”。如果一个学生没有通过断语获得“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.

我会这样修改这个过程(你的代码对你有用吗?)

测试:

在您的评论之后编辑,我认为这段代码可能更有用

honor(S) :- once(a_grade(S)).
a_grade(S) :- grade(S,_,_), (grade(S,_,Y), Y \= 'A', !, fail ; true).
更多编辑另一个更好的定义,使用内置的所有解决方案/3:

使用setof/3再进行一次编辑,我们可以避免构建整个列表,但只构建相关主题的列表:

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

有两种方法可以获得上述问题的答案: 1.首先使用工程师指定的setof

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

ismember(S):-grade(S,_,Y),!.
honor(S) :- ismember(S),\+ (grade(S,_,Y), Y \= 'A').

给定一个学生ID,它应该只告诉正确或错误。但是上面的定义将告诉每一个“a”。。我的代码只为在所有科目中没有得分为“A”的学生提供正确的输出。是的,现在它很好。我试图使用基本运算获得结果。你认为不使用一次谓词就可以吗?还有我这边的一个小编辑:荣誉(S):-一次(A_等级)。a_等级:-(等级S,Y,Y\='a',!,不及格;正确)。
honor(S) :-
   setof(S, C^G^(grade(S,C,G), \+ (grade(S,_,G2), G2 \= 'A')), Ss),
   member(S, Ss).
honor(S) :-
   setof(S, C^G^(grade(S,C,G), \+ (grade(S,_,G2), G2 \= 'A')), Ss),
   member(S, Ss).
ismember(S):-grade(S,_,Y),!.
honor(S) :- ismember(S),\+ (grade(S,_,Y), Y \= 'A').