Пролог: оператор неравенства

Я использую 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, Смотрите также:

Разница между X\=Y и dif(X,Y)

Что логического "не" в Прологе?

Использование \==/2 или dif/2

Другие вопросы по тегам