如何停止在序言中两次打印相同的值?
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
来更正它,但在这种情况下,我很想使用条件语句来确保我不会得到无用的选择点。
我在序言中有这个事实或数据库,以查看教育程度是否相同或低于。例如,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
来更正它,但在这种情况下,我很想使用条件语句来确保我不会得到无用的选择点。