Реализуйте этот простой лог c в Прологе - PullRequest
1 голос
/ 05 августа 2020

Как реализовать эти простые операторы в Прологе?

  1. A (generi c) четное число XOR a (generi c) число нечетное.
  2. x - нечетное число.

Тогда, если я запрошу «x нечетно», я должен получить истину.

Пожалуйста, добавьте некоторые пояснения, так как я нахожу Prolog удивительно сложным .

Примечание: Я использую swi sh .swi-prolog.org

EDIT: Я пробовал следующее, но это дает некоторую ошибку:

number(x).                          /*x is a number*/
odd(K) :- number(K) ; not(even(K)). /*if a number is not even => is odd*/
even(K) :- number(K) ; not(odd(K)). /*if a number is not odd => is even*/
not(odd(x)).                        /*x is not odd*/

?-even(x). /*Gives No permission to modify static procedure `number/1'*/

Формально, как это будет правильная процедура?

1 Ответ

0 голосов
/ 07 августа 2020

То, как вы определили свои предикаты для odd и even, выглядит странно. Вы сказали, что variable(X) - это четное число или нечетное число. И вы сказали, что variable(X) нечетно, если это число или нет. В этом логе c вы говорили, что любое число всегда четное и нечетное, а любое нечисловое вызовет ошибку переполнения стека.

Кроме того, причина ошибки «Нет разрешения на изменение состояния. c процедура 'число / 1' "связана с тем, что уже существует встроенный предикат для определения того, является ли параметр числом. Это просто number(X).

Также существует предикат для выполнения целочисленного деления с остатком. Например:

?- divmod(42,5,X,Y).
X = 8,
Y = 2.

Итак, в этом примере говорится, что 8 x 5 + 2 = 42.

Мы можем использовать это для определения even и odd.

even(X) :- number(X),divmod(X,2,_,0).
odd(X) :- number(X),divmod(X,2,_,1).

Число будет четным при делении на 2, оно имеет остаток 0 и нечетным, если остаток равен 1.

Вместо того, чтобы определять odd(X) :- not(even(X)), я определил оба предиката как Как правило, лучше определять предикаты положительно, чем отрицанием, поскольку это может повлиять на ожидаемое поведение. В данном случае это не имеет значения, но в целом это хорошая привычка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...