На этом шаге мы рассмотрим примеры использования внутренней базы фактов.
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).
database- dbal % dbal домен для этих предикатов
person(name,telno)
city(cno,cname)
Получив такие объявления, компилятор Пролога сгенерирует соответствующий домен dba1:
domains dbal=person(name,telno); cityf(cno,cname)
Этот домен dba1 может быть использован так же, как любой другой домен.
Со следующего шага мы начнем рассматривать создание и работу с окнами.