Ошибка одноэлементных переменных - PullRequest
0 голосов
/ 10 мая 2018

Я просматриваю книгу Ивана Братко «Программирование для искусственного интеллекта», я застрял в основной проблеме и столкнулся с ошибкой, и предыдущие ответы о переполнении стека, похоже, не помогают.

Я застрял, пытаясь написать правило, используя предыдущий факт в качестве аргумента и получая ошибку

Single variables: [Y]

код, который я пытаюсь запустить, это

parent(myfather,me).
parent(mymother,me).

happy(X) :- 
  parent(X,Y).

В прошлом мне удавалось создавать подобные правила, и я думаю, что просто упускаю что-то очень очевидное в отношении того, почему это не работает. Я думаю, что когда это компилируется, и я запускаю

happy(myfather).

Он вернет true, поскольку заменит счастливое правило X на myfather, затем проверит parent (X, Y) на parent (myfather, Y). и попробуйте затем выяснить, есть ли факт, который говорит родитель (мой отец, что-то еще ....).

Я также использую swipl на macOS, если это актуально, спасибо.

EDIT:

Я не проверял, но программа на самом деле работает так, как должна, но все равно выдает предупреждение, однако имеет смысл, есть ли способ избавиться от ошибки или понять, почему она существует?

1 Ответ

0 голосов
/ 10 мая 2018

Одиночные переменные - это предупреждение , не ошибка.

Это должно напомнить вам, что у вас есть именованная переменная, встречающаяся в правиле только один раз.

Если вы хотите отключить предупреждение для этой конкретной переменной, переименуйте его в имя, начинающееся с подчеркивания (например, _Y), например ::

happy(X) :- parent(X, _Y).

или переименуйте его в _ ( анонимная переменная ), например ::

happy(X) :- parent(X, _).

Этот тип предупреждения очень полезен для обнаружения опечаток, например, имя переменной с ошибкой:

happy(Child) :- parent(Chidl, Parent), happy(Parent).

Предупреждение: синглтонные переменные: [Child, Chidl]

или другие опечатки, например, точка, введенная вместо запятой:

happy(Child) :- parent(Child, Parent). happy(Parent).

Предупреждение: одиночные переменные: [Parent]

Предупреждение: одиночные переменные: [Parent]

или другие логические ошибки.

Без предупреждения об одноэлементной переменной эти ошибки останутся незамеченными и их будет сложнее отследить.

То есть, когда вы видите это предупреждение, оно обычно звонит в колокольчик и ищет другие типы ошибок. Если других ошибок нет, просто исправьте переменную singleton, сделав ее анонимной.

Если вы знаете, что делаете, вы можете глобально отключить предупреждение с помощью:

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