WedX - журнал о программировании и компьютерных науках

Возвращаемое значение пролога для правила не печатается правильно

Это правило:

 get_style(S,E,R) :- echo_file('Playing_style.txt'),
               write('Enter digit opeion: '), read(S),
               write('Style: '), write(S),
               nth0(S, [ 'Technical', 'Positional',  'Attacking',   
                         'Calculating', 'Tricky', 'Dynamic', 'Practical',
                         'Intuitive', 'Logical', 'Young' ], E, R).

Исполнение дает:

1 ?- [echo_file].
true.

2 ?- get_style(S,E,R).
0. Technical
1. Positional
2. Attacking
3. Calculating
4. Tricky
5. Dynamic
6. Practical
7. Intuitive
8. Logical
9. Young:
Enter digit opeion: 5.
Style: 5
S = 5,
E = 'Dynamic',
R = ['Technical', 'Positional', 'Attacking', 'Calculating', 'Tricky', 'Practical', 'Intuitive', 'Logical', 'Young'] .

3 ?- write(S).
_G1211
true.

4 ?- write(E).
_G1211
true.
09.09.2016

Ответы:


1

Чтобы уточнить ответ Майкла Конвингтона: имена переменных Пролога, которые вы назначаете, не играют роли. Если для любого X выполняется предикат p(X), то то же самое верно для любых Y и p(Y). Поэтому многие реализации пролога представляют переменную только целым числом, например SWI Prolog напечатан как _G123, _G345 и т. Д. Опять же, в зависимости от того, какую реализацию вы используете, верхний уровень (приглашение, в котором вы вводите свой запрос) пытается быть умным в именах переменных: он знает, что внутренняя переменная _G123 соответствует S и выбирает тот, который вы ввели:

?- X = f(Y).
X = f(Y).

Если я сделаю Y анонимным (т.е. вообще не дам имя переменной), написав _, я увижу внутреннее имя:

?- X = f(_).
X = f(_G123).

К сожалению, write/1 не знает столько, сколько верхний уровень, и использует внутреннее имя. Как я упоминал ранее, с логической точки зрения имя переменной не имеет значения. Следовательно, если вам нужен конкретный термин, вам нужно заменить атом: вы просто добавляете объединение S=spaceshuttle к своей цели:

?- S = spaceshuttle, write(S).
spaceshuttle
S = spaceshuttle.

Средняя строка - это результат write/1, а последняя строка - это подстановка вашего ответа. Что может вас смутить, так это то, что ваш код использует нотацию 'X' для создания атома, который начинается с заглавной буквы - обычно это переменная. В этом случае вы просите 'X' быть константой. Затем write также делает то, что вы ожидали:

?- write('S').
S
true.

Разницу легко увидеть, если попробовать несколько унификаций:

?- 'X' = 'Y'.
false.

?- f('X') = f('Y').
false.

?- X = Y.
X = Y.

?- f(X) = f(Y).
X = Y.

Атомы с разными именами никогда не могут быть одинаковыми, что приводит к «ложному». Но две переменные могут быть одинаковыми: верхний уровень просто дает вам условие (X равно Y, если переменные равны). Это выглядит немного круглым, но если вы попросите условие f(X) = f(Y), оно все равно будет сообщать вам, что вы должны заменить X на Y, т.е. всякий раз, когда вы заменяете X чем-то, вам нужно заменить Y на то же самое (что бы это ни было ).

Я также рекомендую взять учебник, который расскажет вам больше о сильных сторонах Prolog (унификация, возврат и т. Д.). В FAQ по comp.lang.prolog есть несколько полезных указателей (вопросы 8 и 14) .

10.09.2016
  • Знак подчеркивания в начале, как в _G123 не, указывает на анонимную переменную. Единственная анонимная переменная - _. В зависимости от системы Пролога, переменная, имя которой начинается с символа подчеркивания может не сообщаться как одноэлементная переменная, но это не то же самое, что и анонимная переменная. 11.09.2016
  • Спасибо, я удалил там комментарий об анонимных переменных, так как он все равно отвлекал от исходного вопроса. 11.09.2016

  • 2

    Результат типа _S5234 означает, что «эта переменная не создается» (не имеет значения).

    Все переменные Пролога локальны. Переменные S, E и R перестают существовать, как только отображается следующий запрос?

    То есть вы не можете «хранить значения в» переменных в Прологе. Назначение переменных Пролога - сделать так, чтобы одно и то же значение появлялось более чем в одном месте в одной и той же формуле, правиле или факте.

    10.09.2016
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]