На этом шаге мы рассмотрим примеры использования внутренней базы фактов.
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 может быть использован так же, как любой другой домен.
Со следующего шага мы начнем рассматривать создание и работу с окнами.