Пролог: оператор неравенства
Я использую SICStus Prolog и имею ряд фактов:
student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths').
Я хочу получить общий предмет для двух учеников, где оба ученика разные, поэтому я получил:
sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).
Тем не менее, когда я вхожу:
sharedSubject('John Henry', F, E).
я получил F = 'John Henry'
, Может кто-нибудь указать, где я иду не так и что мне нужно делать? Благодарю.
2 ответа
Вы должны переместить S1 \== S2
цель до конца как. Если вы позвоните sharedSubject/3
предикат со вторым аргументом не создан, как в вашем sharedSubject('John Henry', F, E)
, S1 \== S2
цель всегда будет верной
?- 'John Henry' \== S2.
true.
Также:
?- S1 \== S2.
true.
Смотрите документацию стандарта (\==)/2
встроенный предикат в документации системы Prolog. Короче говоря, если вы не хотите проверять, являются ли две переменные одинаковыми, убедитесь, что оба аргумента создаются при вызове этого предиката равенства терминов.
Использование dif/2
вместо этого или установите \==
в конце правила - которое не так безопасно, как dif/2
, Смотрите также: