Программа на Visual Prolog 7

Узнай цену своей работы

Формулировка задачи:

Подскажите, можно ли на прологе сделать такую последовательность: 1. Есть 4 направления в ВУЗе. Для каждого направления создать счетчик для ответов yes 2. Вывести 20 вопросов подряд и потребовать ответить yes/no (каждому направлению будет принадлежать по 5 вопросов) 3. Если на вопрос будет ответ yes, то необходимо увеличить счетчик соответствующего направления на единицу 4. Проверить, какой из счетчиков больше всего, и вывести соответствующее ему направление в конце

Решение задачи: «Программа на Visual Prolog 7»

textual
Листинг программы
%Экспертная системы для диагностики 
implement main
    open core, console
domains
 
class facts
    %высказывания: №      текст   К_критерий1, К_критерий2, К_критерий3
    question:        (integer,string,          integer,         integer,            integer). %
 
    %ответ для записи в базу данных
    %                  №, К_критерий1, К_критерий2, К_критерий3
    answer:(integer N, integer К_критерий1, integer К_критерий2,  integer К_критерий3).
 
    %Счётчики (факт-переменная) для суммирования показателей
    с_критерий1 : integer :=0.
    с_критерий2 : integer :=0.
    с_критерий3 : integer := 0.
class predicates
    repeat: () multi.  %вспомогательный предикат для организации цикла
    explanation:().  %пояснение о шкале ответов
    poll:() .              %опрос
    check:(integer[in]) determ.   %проверка ответа
    ask:(integer,string,integer) determ (i,i,o).  %задать вопрос и получить ответ
    analysis:(integer,integer,integer) procedure (o,o,o) . %подсчет суммарных показателей
    countsum:(). %суммирование  показателей из базы данных
    grade:(integer,symbol) procedure (i,i). %словесная оценка покателей
    todo:(symbol [in]) determ. %вывод показателя для словесной оценки
    write_result:(integer,integer,integer) procedure (i,i,i). %вывод результатов диагностики
    title:() procedure. %вывод заставки с описанием
clauses
    %для повторения до получения нужного условия
    repeat().
    repeat():-  repeat().
 
%список высказываний
%         №    текст      , К_критерий1, К_критерий2,  К_критерий3
question(1, "вопрос1",0,1,0).
question(2, "вопрос2",1,0,0).
question(3, "вопрос3",0,0,1).
question(4, "вопрос4",0,1,0).
question(5, "вопрос5",1,0,0).
question(6, "вопрос6",0,1,0).
question(7, "вопрос7",0,0,1).
question(8, "вопрос8",0,1,0).
question(9, "вопрос9",1,0,0).
question(10, "вопрос10",0,0,1).
question(11, "вопрос11",0,1,0).
question(12, "вопрос12",1,0,0).
question(13, "вопрос13",0,0,1).
question(14, "вопрос14",1,0,0).
question(15, "вопрос15",0,1,0).
question(16, "вопрос16",0,0,1).
question(17, "вопрос17",0,0,1).
question(18, "вопрос18",1,0,0).
question(19, "вопрос19",0,1,0).
question(20, "вопрос20",1,0,0).
question(21, "вопрос21",0,0,1).
 
%описание шкалы ответов
explanation() :- write("Каждое высказывание оценивайте по 4-бальной шкале:"), nl,
                        write("1 - описание1;"), nl,
                        write("2 - описание2;"), nl,
                        write("3 - описание3;"), nl,
                        write("4 - описание4."), nl,nl.
 
 
%опрос (сбор информации)
    poll ():- question(N,Вопрос,К_критерий1,К_критерий2,К_критерий3), %найти вопрос
          ask(N,Вопрос,Ответ), %спросить "N.Вопрос", получить Ответ
          %записать ответ в базу данных
          assert(  answer(N, Ответ*К_критерий1, Ответ*К_критерий2, Ответ*К_критерий3)),
          fail. %принудительный неуспех для перебора всех вопросов
    poll():-!. %чтобы опрос закончился успешно
 
 
    %задать вопрос и получить ответ. повторять пока не введут число в пределах 1-4
    ask(N,Вопрос,Ответ):-   repeat(), write(N,". ",Вопрос),nl,
                                        write("Оцените высказывание по шкале 1-4 (0-подсказка о шкале):"),
                    Ответ=read(), check(Ответ),!.
 
    %проверка, что ответ в пределах 1-4, иначе вывод подсказки
    check(Ответ) :- Ответ >=1, Ответ<=4,!.
    check(_) :-  explanation,fail.
 
    %анализ результатов опроса
    analysis(критерий1,критерий2,критерий3):-countsum, %подсчитать суммарные показатели
                                                                                    критерий1= с_критерий1,
                                                                                    критерий2 = с_критерий2,
                                                                                    критерий3 = с_критерий3, !.
 
    %подсчитать сумму всех показателей
    countsum():- answer(_,К_критерий1,К_критерий2,К_критерий3), %взять очередной ответ
                        с_критерий1 := с_критерий1+К_критерий1,                      %учесть его в сумме
                        с_критерий2 := с_критерий2+К_критерий2,                 %соответсвующего показателя
                        с_критерий3 := с_критерий3+К_критерий3,
                        fail.     %принудительный неуспех для перебора всех ответов
    countsum():- !.    %чтобы суммирование закончилось успешно
 
    %словесная оценка показателя
   grade(К,Показатель):- К>=0,К<=10,write("Реакция1 на "), todo(Показатель),
                                                          write(" Пояснение1."),!.
   grade(К,Показатель):- К>=11,К<=20,write("Реакция2 на "),todo(Показатель),
                                                            write(" Пояснение2."),!.
   grade(К,Показатель):- К>=21,К<=25,write("Реакция3 на "), todo(Показатель),write(" Пояснение3."), !.
   grade(К,Показатель):- К>=26,К<=28,write("Реакция4 на "), todo(Показатель),write(" Пояснение4."), !.
   grade(_,_):-!.
 
   todo("критерий1"):-write("расшифровка критерий1.").
   todo("критерий2"):-write("расшифровка критерий2.").
   todo("критерий3"):-write("расшифровка критерий3.").
 
    %вывод результатов диагностики
    write_result(критерий1,критерий2,критерий3):-nl,write("РЕЗУЛЬТАТ ДИАГНОСТИКИ:"),nl,
                        write("Показатель1=", критерий1,"."), grade(критерий1,"критерий1"),nl,
                                        write("Показатель2=", критерий2,"."), grade(критерий2,"критерий2"),nl,
                                        write("Показатель3=", критерий3,"."), grade(критерий3,"критерий3"),nl,!.
   %вывод заставки с описанием
   title():-   write("ЭКСПЕРТНАЯ СИСТЕМА ДЛЯ ДИАГНОСТИКИ"), nl,
                write("...того-то и того-то..."), nl,
                write("===Название системы==="), nl,
                write("Вам будет предложено несколько высказываний, которые следует оценить."),nl,
                explanation.
 
   run() :-  title, %вводная инструкция
                poll, %опрос
                analysis(критерий1,критерий2,критерий3), %анализ ответов
                write_result(критерий1,критерий2,критерий3), %вывод результата
                clearInput,  _ = readLine(). %пауза
 
end implement main
 
goal
    console::run(main::run).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5