Я пытаюсь выполнить упражнение, в котором мне нужно написать предикат 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)).
Я не понимаю, почему мой предикат не будет работать. Он возвращает синтаксическую ошибку с «Ожидается оператор». Я говорю, что не имеет значения, в каком порядке вы записываете факты. Это означает, что вы можете сказать цвета (красный, синий) или цвета (синий, красный), но вы не можете запрашивать цвета с тем же именем, чтобы оно не возвращало ложь.
Я бы хотел знать:
- Почему это недопустимое выражение.
- Что я могу сделать, чтобы решить проблему.
,
перед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.2015not
. Ноnot/1
устарел. Стандартный оператор для отрицания как ошибки —\+/1
. - person Paulo Moura   schedule 28.01.2015