Шаг 64.
Основы логического программирования.
Примеры использования внутренней базы фактов

    На этом шаге мы рассмотрим примеры использования внутренней базы фактов.

  1. Следующая программа - простой пример того, как с помощью внутренней базы фактов написать классификационную экспертную систему. Важным преимуществом использования базы фактов в этом примере является то, что вы можете добавлять знания (и удалять их) во время работы программы.
       domains
          thing=string 
          conds=cond*
          cond=string
       database - knowledgeBase
          is_a(thing,thing,conds)
          type_of(thing,thing,conds) 
          false(cond)
       predicates
          run(thing)
          ask(conds)
          update
       clauses
          run(Item):-
             is_a(X,Item,List),
             ask(List),
             type_of(ANS,X,List2),
             ask(List2),
             write("The ",Item,"you need is a/an ",Ans),nl.
          run(_):-
             write("This program does not have enough "), 
             write("data to draw any conclusions."), nl.
          ask([ ]).
          ask([H |T]):-
             not(false(H)),
             write("Does this thing help you to "),
             write (H," (enter y/n)"),
             readchar(Ans),nl,
             Ans='y',
            ask(T).
         ask([H |_]):-
            assertz(false(H)),
            fail.
    
       is_a(language,tool,["communicate"]).
       is_a(hammer,tool,["build a house","fix a fender","crack a nut"]).
       is_a(sewing_machine, tool,["make clothing","repair sails"]).
       is_a(plow, tool, ["prepare field","farm"]).
    
       type_of(english,language,["communicate with people"]).
       type_of(prolog,language,["communicate with a computer"]).
    
       update:-
          retractall(type_of(prolog,language,
                        ["communicate with a computer"])),
          asserta(type_of("Visual  Prolog",   language,
                      ["communicate with a personal  computer"])),
          asserta(type_of(prolog,   language,
                      ["communicate with a mainframe computer"])).
    
        Текст этой программы можно взять здесь.

        Следующие факты могли бы быть занесены с помощью предиката asserta или assert, или считаны из файла с помощью предиката consult. Однако в этом примере они расположены в разделе clauses.

       is_a(language,tool,["communicate"]).
       is_a(hammer,tool,["build a house","fix a fender","crack a nut"]).
       is_a(sewing_machine,tool,["make clothing","repair sails"]).
       is_a(plow, tool,["prepare fields","farm"]).
    
       type_of(english,language,["communicate with people"]).
       type__of (prolog,language,["communicate with a computer"]).
    

        В качестве цели введите:

       goal
          run(tool).
    

        Теперь введите следующую цель:

       update, run(tool).
    

        Предикат update включен в исходный код программы, удаляет факт

       type_of(prolog,language,["communicate with a computer"]).
    

    из внутренней базы фактов knowledgeBase и добавляет два новых факта в программу:

       type_of(prolog,language,["communicate with a mainframe computer"])
       type_of("prolog",language,["communicate with a personal  computer"])
    

        С помощью вызова предиката save/2 с именами текстового файла и базы фактов в качестве его аргументов можно сохранить всю базу данных факт и knowledgeBase в текстовом файле. Например, после вызова

       save("mydata.dba",knowledgeBase)
    

    файл mydata.dba будет аналогичен разделу clauses обычной программы Пролога, и каждый факт будет записан в отдельной строке. С помощью предиката consult можно считать факты из этого файла в память:

       consult("mydata.dba",knowledgeBase).
    
  2. Вы можете манипулировать фактами, описывающими предикаты баз фактов (фактами, описанными в разделах database) так, как будто они являются термами. При объявлении базы фактов Пролог генерирует внутренний домен, соответствующий фактам из раздела database. Например:
       database- dbal %  dbal домен для этих предикатов
          person(name,telno)
          city(cno,cname)
    

        Получив такие объявления, компилятор Пролога сгенерирует соответствующий домен dba1:

       domains
          dbal=person(name,telno); cityf(cno,cname)
    

        Этот домен dba1 может быть использован так же, как любой другой домен.

    Со следующего шага мы начнем рассматривать создание и работу с окнами.




Предыдущий шаг Содержание Следующий шаг