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','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) :- 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).

关于prolog - 当在 prolog 的搜索树中搜索完所有可能性时的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786024/

相关文章:

prolog - 翻译为 DCG Semicontext 不起作用 - 继续

prolog - Prolog 中递归谓词末尾的剪切

Prolog 类型不兼容

prolog - 使用 CLP(FD) 约束两个列表以总共 N 个连续元素开始

recursion - Prolog 二进制加法

prolog - 模函数和变量域

windows-7 - SWI Prolog 中的文件异常处理和等待进程

prolog - 删除一封信

prolog - 避免 Prolog 中的数据冗余

在 Prolog : Not enough memory 中对大列表进行排序