У меня есть эти факты или база данных в прологе, чтобы узнать, такое же образование или меньше. например, 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;
false.
0
David Andvett 18 Ноя 2017 в 07:18

1 ответ

Лучший ответ

По сути, это потому, что в третьем предложении edu_lessOrEqual/2 вы рекурсивно вызываете edu_lessOrEqual/2, поэтому вы получаете случай, когда Z и Y оба инстанцируются для phd (phd фактически равно phd, поэтому он выполняет изложенную вами логику). Вы можете исправить это, добавив Z \= Y в конце третьего предложения, но это ситуация, когда у меня возникнет соблазн использовать условный оператор только для того, чтобы убедиться, что я не закончу с бесполезными точками выбора.

2
Daniel Lyons 18 Ноя 2017 в 04:32