Принятие 2 разных цветов, но не одинаковых цветов

Я пытаюсь выполнить упражнение, в котором мне нужно написать предикат colors/2 (или colors(C1,C2) :- ...), который работает следующим образом:

?- colors(red,blue).
true.
?- colors(red,red).
false.
?- colors(blue,blue).
false.

Итак, по сути, я должен написать свой предикат таким образом, чтобы он не принимался, когда вы вводите один и тот же цвет дважды.

Я определяю свои факты так:

col(red,blue).
col(purple,orange).
col(green, yellow). 

Я делаю свой предикат следующим:

colors(X,Y) :- (col(X,Y); col(Y,X)) not (col(X,X); col(Y,Y)).

Я не понимаю, почему мой предикат не будет работать. Он возвращает синтаксическую ошибку с «Ожидается оператор». Я говорю, что не имеет значения, в каком порядке вы записываете факты. Это означает, что вы можете сказать цвета (красный, синий) или цвета (синий, красный), но вы не можете запрашивать цвета с тем же именем, чтобы оно не возвращало ложь.

Я бы хотел знать:

  1. Почему это недопустимое выражение.
  2. Что я могу сделать, чтобы решить проблему.

person Jubl    schedule 28.01.2015    source источник
comment
Вы пропустили запятую , перед not, а not/1 ожидает один термин, поэтому используйте больше круглых скобок: colors(X,Y) :- (col(X,Y); col(Y,X)), not( (col(X,X); col(Y,Y)) ). И лучше \+, чем not(_), поэтому colors(X,Y) :- (col(X,Y); col(Y,X)), \+ (col(X,X); col(Y,Y)). Вы знаете, что col(X,X) и col(Y,Y) всегда будут ложными, верно? Потому что нет фактов или предикатов, где col(X,X) истинно, когда оба аргумента одинаковы. Так что not( (col(X,X); col(Y,Y)) ) всегда будет true.   -  person lurker    schedule 28.01.2015
comment
Вы пропустили запятую перед not. Но not/1 устарел. Стандартный оператор для отрицания как ошибки — \+/1.   -  person Paulo Moura    schedule 28.01.2015
comment
@lurker Спасибо! Если вы опубликуете это как ответ, я с удовольствием сделаю его лучшим ответом. Не могу поверить, что я проглядел это. Я чуть не вырвал себе волосы!   -  person Jubl    schedule 28.01.2015
comment
Иногда это просто проблема не видеть леса из-за деревьев. :)   -  person lurker    schedule 28.01.2015


Ответы (1)


Несколько вещей:

Вам не хватает запятой (,) перед not, а not/1 предполагает один термин в круглых скобках, поэтому используйте больше круглых скобок:

colors(X,Y) :- (col(X,Y); col(Y,X)), not( (col(X,X); col(Y,Y)) ).

Как указал @PauloMora, not/1 устарел в пользу ISO \+/1, поэтому лучше было бы:

colors(X,Y) :- (col(X,Y); col(Y,X)), \+ (col(X,X); col(Y,Y)).

Затем, глядя на col(X,X) и col(Y,Y), нет фактов или предикатов, где col(X,X) было бы истинным (оба аргумента одинаковы). Таким образом, каждое из них всегда будет ложным, а \+ (col(X,X); col(Y,Y)) всегда будет истинным. Таким образом, выражение является излишним, и ваш предикат становится (по крайней мере, с шаблоном, установленным в вашем текущем наборе фактов):

colors(X,Y) :- col(X,Y) ; col(Y,X).

Поскольку у вас нет фактов, оговоренных совпадающими цветами (col(x,x)), запросы типа col(red, red) все равно не будут выполняться.


Согласно рекомендации @false, для проверки целостности на равенство X и Y подходящим механизмом будет dif(X, Y):

colors(X, Y) :- (col(X, Y) ; col(Y, X)), dif(X, Y).

Скобки желательны, так как , имеет более высокий приоритет, чем ;. Это защитит от случая, когда у вас есть факт или предикат col/2, в котором оба аргумента одинаковы (идентичны или унифицированы).

person lurker    schedule 28.01.2015
comment
Прохладный. Я действительно заметил, что когда я добавлял дополнительный факт, например, col(красный,синий), а затем col(желтый,синий), это давало мне ложь в исходном выражении, так что это мне очень помогло. - person Jubl; 28.01.2015
comment
@Jubi рад, что это помогло. - person lurker; 28.01.2015
comment
Я не понимаю... почему нет dif(X,Y)? - person false; 28.01.2015
comment
@false, учитывая текущий набор данных OP, разве это не лишнее (именно это я имел в виду под комментарием в своем ответе, по крайней мере, с шаблоном, установленным в вашем текущем наборе фактов)? - person lurker; 28.01.2015
comment
Я скорее предполагаю, что OP хотел (= цель упражнения) либо какую-то проверку целостности, либо что-то с совместимостью цветов или тому подобное. - person false; 28.01.2015
comment
@false, я понимаю, что ты имеешь в виду. Хорошее предложение. - person lurker; 28.01.2015