2012-03-24 4 views
1

Я хочу написать программу, которая устанавливает значение холода в true, если пользователь вводит зиму и устанавливает теплоту в true, если пользователь вводит лето. Это то, что я до сих пор:Пользовательский ввод в прологе

start :- write('What season is it?: '), read(X), season(X). 
cold :- season(winter). 
warm :- season(summer). 

Однако, когда я запрашиваю начать и введите зиму в течение сезона я получаю сообщение об ошибке, что сезон/1 не определен. Чтобы исправить это, я попытался изменить мой код на следующее:

start :- season(X). 
season(X) :- write('What season is it?: '), read(X). 
cold :- season(winter). 
warm :- season(summer). 

Теперь, когда я запрашиваю запуске она попросит сезона, как и ожидалось, и я вошел в зиму. Я запросил холод, ожидая возвращения истины, так как я решил, что сезон (зима) будет правдой, но вместо этого мне снова предложили ответить «в каком сезоне это?». Как я могу сделать эту простую работу?

ответ

2

Поскольку «» и «warm/0» не принимают аргументов, невозможно изменить результат во время выполнения без изменения их определения во время выполнения. Самый простой способ сделать это - просто добавить или удалить факты «cold.» и «warm.» в зависимости от пользовательского ввода, используя assert/1 и retractall/1.

start :- write('What season is it?: '), read(X), season(X). 
season(summer) :- retractall(cold), assert(warm). 
season(winter) :- retractall(warm), assert(cold). 
1

Определяя факты, вам нужно немного изменить синтаксис.

start(Y) :- write('What season is it?: '), read(X), nl, season(X,Y). 
season(winter,cold). 
season(summer,warm). 

Обратите внимание, что пользователю необходимо завершить вход с полной остановкой. (например, зимой.)

+0

С помощью этого метода всякий раз, когда я запрашиваю холодный или теплый, я получаю ошибки – user1279812

+0

Вы должны запросить начало (Y). –

+0

@ пользователь1279812 это сработало? –

3

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

Такие вещи были очень модными в 80-е годы, когда появились экспертные системы , а также могут быть выполнены с помощью Prolog. Вот статья, описывающая примерно разницу между «обратной цепочки» и «вперед цепочки»:

Logic Программирование Associates Ltd.
ProWeb: Экспертная система

Я попытался переделать что-то похожее на вышеприведенном вперед цепочки через механизм расширения предложения, который доступен во многих системах Prolog и через повестку дня, которая хранится в базе знаний как обычный фактов. Механизм расширения изменяет правило следующего вида:

P :- A 

В правило, где Х представляет собой свежий переменная не встречающиеся в Р или А:

delta(X, P) :- A_new(X) 

Где A_new является условием, что говорит, что Р является новым, когда появился новый факт X. Давайте рассмотрим ваш пример:

?- ['delta.p']. 
?- [user]. 
:- forward season/1. 
:- forward cold/0. 
:- forward warm/0. 
cold :- season(winter). 
warm :- season(summer). 
^D 

Этих два правила Пролога будет превращены в следующей дельте/2 правил через переписывание.Так как правила очень просты, дельта/2 правила также очень прост:

?- listing(delta/2). 
delta(X, cold) :- 
    X = season(winter). 
delta(X, warm) :- 
    X = season(summer). 

Ниже приведен пример сеанса:

?- list. 
Yes 
?- volunteer(season(winter)). 
Yes 
?- list. 
season(winter). 
cold. 
Yes 

Перезапись в delta.p очень примитивные. Переписывание может быть усилено для поддержки жестких предикатов и для поддержки динамического удаления фактов. Возможные области дополнительного применения "прямой цепочки" тогда:

  • Natural Language Processing
  • Constraint Решение

С наилучшими пожеланиями

Текущий дельта/2 переписывания после нескольких летние разработки:
http://www.jekejeke.ch/idatab/doclet/blog/en/docs/15_min/02_reference/minimal/delta.html

статье, показывая, что ограничение магазин может быть смоделирован:
https://plus.google.com/+JekejekeCh/posts/8oHErwopKxK

P.S .: Имя предиката добровольца/1 стеблей образуют Nexpert Object,
экспертная система оболочки в использовании в 80-х и 90-х годов.
NEXPERT OBJECT версия 3.0, Жан-Мари Шове, Neuron Data, Inc.

PPS: Но вы можете для поиска более новые вещи, такие как Rete-NT, или OWL:
http://answers.semanticweb.com/questions/3304/forward-vs-backward-chaining

0
season(winter,cold). 
season(summer,warm). 
start:-write('What season is it?'),write(' '),read(X),season(X,Y),write(Y). 

Результат будет выглядеть так:
? - начало.
В какое время года? зима.
cold
true.

Смежные вопросы