2016-11-18 3 views
1

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

blue(X) :- 
    color(X,blue). 
white(X) :- 
    color(X,white). 
yellow(X) :- 
    color(X,yellow). 
orange(X) :- 
    color(X,orange). 
red(X) :- 
    color(X,red). 

Запрашиваемая для ввода:

askColor(X,Y) :- 
       write('color of '),write(X),tab(2), 
       read(Z), 
       asserta(color(X,Z)), 
       Y==Z. %only return "true" if the asserted color is the one we're looking for. 
% trying to do "if we know the color is not Y, fail. otherwise (if we don't have a value for the color) ask the user". however, it always asks the user :(
color(X,Y) :- atom(Y), ((Z\=Y,atom(Z), color(X,Z)) -> fail ; askColor(X,Y)). 

Желаемый результат будет таким:

  • пользователь вводит blue(name). с цветом «Имя» неизвестно, мы спрашиваем пользователя. если пользователь вводит «синий», color(name, blue) хранится в КБ, и мы получаем «истину» в результате (мы предполагаем это на следующих шагах). Если что-то еще введено, оно сохраняет информацию и возвращает «false». это работает нормально.
  • будущие запросы для blue(name) или color(name,blue) немедленно возвращают «истину», как и ожидалось.
  • сейчас, когда дела идут не так:
    • будущих звонков color(name,Y) вернуться Y=blue в качестве решения, однако он также запрашивает ввод данных пользователя.
    • звонки red(name) или color(name, red) по-прежнему запрашивают у пользователя ввод. они должны вместо этого немедленно вернуть «ложь», потому что color(name,blue) известен, а «синий» не равен «красным».

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

+1

Это очень устаревший стиль программ на Прологе. Вот [учебник] (http://www.amzi.com/AdventureInProlog/), который хорошо описывает этот стиль. Я не уверен, что вы найдете точно такие же встроенные модули, но все прологи имеют функциональность, используемую в этом учебнике в той или иной форме. –

ответ

0

Может быть эти факты полезны:

:- dynamic db_color/2. 

color(X,Y) :- 
    db_color(X,Y). 

color(X,_) :- 
    db_color(X,_), !, fail. 

color(X,Y) :- 
    write('color of '),write(X),tab(2), 
    read(Z), 
    asserta(db_color(X,Z)), 
    Y=Z. 

некоторые запросы и результаты:

?- color(apple,blue). 
color of apple red. 

false. 

?- color(apple,blue). 
false. 

?- color(apple,red). 
true ; 
false. 

?- color(apple,X). 
X = red ; 
false. 

?- color(X,blue). 
false. 

?- color(X,red). 
X = apple ; 
false. 

?- color(X,Y). 
X = apple, 
Y = red ; 
false 
+0

из того, что я понимаю, должен быть отдельный предикат для хранения пользовательского ввода? – Xilef11

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