如何停止在序言中两次打印相同的值?

How to stop printing the same value twice in prolog?

我在序言中有这个事实或数据库,以查看教育程度是否相同或低于。例如,highschool <= highschool 为真,highschool <= phd 也为真,但 masters <= highschool 为假。

edu_less(high_school, bachelor).
edu_less(bachelor, masters).
edu_less(masters, phd).

edu_lessOrEqual(X,X).
edu_lessOrEqual(X, Y):- edu_less(X,Y).
edu_lessOrEqual(X, Y):- edu_less(X,Z),
                        edu_lessOrEqual(Z,Y).

但这会输出

edu_lessOrEqual(masters, phd).
true;
true;
false.

当我只想在输出中打印一个 true 时。

true;
false.

基本上,这是因为在edu_lessOrEqual/2的第三个子句中,你递归调用edu_lessOrEqual/2,所以你最终会遇到Z和Y都被实例化为phd的情况( phd 实际上等于 phd 所以它满足了你所阐明的逻辑)。您可以通过在第三个子句的末尾添加 Z \= Y 来更正它,但在这种情况下,我很想使用条件语句来确保我不会得到无用的选择点。