Пролог: сравнение значения предиката с константой
У меня есть некоторые проблемы с прологом, в частности, я не могу сравнить значение предиката с константой.
predicate(9).
compare(X,Y) :- X<Y.
Запуск программы:
?-compare(predicate(X),10).
Почему это не работает? Спасибо за ответ.
2 ответа
Как сказал @Boris ранее: "Предикаты не возвращают значения так, как это делает функция". Здесь вы должны попытаться создать экземпляр переменных в заголовке вашего правила.
Если вы пытаетесь с предикатом compare/2
найти число X больше Y, и в то же время это число X должно быть фактом predicate/1
затем добавьте оба условия в тело вашего правила или предиката compare/2
predicate(9).
compare(X,Y) :- predicate(X), X<Y.
Теперь, если вы проконсультируетесь:
?- compare(X,10).
Ответ будет
X = 9
Как видите, 9 меньше 10, и в то же время 9 факт predicate/1
, И это возвращаемое значение, которое вы ищете.
предосторожность
Обратите внимание, что оператор >/2
, требует, чтобы обе стороны были созданы, поэтому в этом случае вы не сможете запросить значение Y
в вашем предикате
?- compare(9, Y)
</2: Arguments are not sufficiently instantiated
Может быть, и если это имеет смысл, вы можете попытаться создать экземпляр этой переменной для факта predicate/1
тоже.
predicate(9).
predicate(10).
compare(X,Y) :- predicate(X), predicate(Y), X<Y.
?- compare(9,Y).
Y = 10
Предикаты не возвращают значения так, как это делает функция.
Это C:
int nine() { return 9; }
int main() {
int x = nine(); /* x is now 9 */
}
Это Пролог:
% source
nine(9).
% from the top level
?- nine(X).
X = 9.
?- nine(X), X < 10.
X = 9.
?- nine(X), compare(C1, X, 10), compare(C2, 10, X).
X = 9,
C1 = (<),
C2 = (>).
Несколько вещей (стараясь не использовать слишком много языка Prolog):
Что твое predicate/1
и мой nine/1
"делать" - объединять единственный аргумент с целым числом 9. Если объединение завершается успешно, предикат завершается успешно, и теперь аргумент привязывается к 9. Если объединение не удается, предикат завершается неудачей.
?- nine(9).
true.
?- nine(nine).
false.
?- nine(X), nine(Y).
X = Y, Y = 9.
Вы также заметите, что есть стандартный предикат compare/3
это может быть использовано для сравнения терминов Пролог. Поскольку предикаты не имеют возвращаемого значения так, как это делают функции, он использует дополнительный аргумент, чтобы сообщить результат сравнения. Вместо этого вы могли бы попробовать что-то вроде:
% greater_than(X, Y) : true if X is greater than Y according
% to the standard order of terms
greater_than(X, Y) :- X @> Y.
Но это просто определение псевдонима для @>/2
, который сам является предикатом (но был объявлен как оператор, так что вы можете использовать его в инфиксной нотации).
?- @>(a, b).
false.
?- @>(b, a).
true.
То же самое касается </2
, который является предикатом для сравнения арифметических выражений:
?- 2 + 4 =< 6.
true.
?- nine(X), X > 10 - X.
X = 9.
?- nine(X), X > 10.
false.