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

时间:2012-12-09 08:58:08

标签: prolog

我已经编写了以下程序,用于验证“S”指定的学生是否在所有科目中都获得了“A”等级。在这里,我知道当搜索树中的所有路径都已使用等级“A”进行评估时,我只能输出'true'。如果学生没有通过削减谓词获得成绩'A',我就能够实现。但实际上并没有得到如何在搜索完所有路径时将其评估为谓词的谓词。

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.

2 个答案:

答案 0 :(得分:2)

我会以这种方式修改程序(你的代码是否适用于你?)

honor(S) :- grade(S,_,_), (grade(S,_,Y), Y \= 'A', !, fail ; true).

试验:

?- honor(S).
S = 123 ;
S = 123 ;
S = 123 ;
S = 123 ;
S = 123 ;
false.

?- setof(S,honor(S),L).
L = [123].

编辑在你的评论之后,我认为这个片段可能更有用

honor(S) :- once(a_grade(S)).
a_grade(S) :- grade(S,_,_), (grade(S,_,Y), Y \= 'A', !, fail ; true).

更多编辑另一个更好的定义,使用所有解决方案内置setof / 3:

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

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

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

答案 1 :(得分: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').