Загрузка данных


/*        Primer ekspertnoy sistemy              */
/*        baziruyushcheysya na pravilah          */
/*        Ekspert po zhivotnym                   */

domains
database
  d_da(symbol, symbol)
  d_net(symbol, symbol)

predicates
  zapusk
  konsultaciya
  sprosit(symbol, symbol)
  zhivotnoe(symbol)
  kategoriya(symbol)
  da(symbol, symbol)
  net(symbol, symbol)
  zapomnit(symbol, symbol, symbol)
  ochistit
  vyvod_bd

goal
  zapusk.

clauses
/* Sistema polzovatelskogo interfeysa */
zapusk:-
  makewindow(1,7,7, "Ekspertnaya sistema",1,16,22,58),
  nl,write("***************************************************"),
  nl,nl,
  write(" Dobro pozhalovat v ZHIVOTNUYU ekspertnuyu sistemu!"),
  nl,nl,write(" Eta sistema legko opredelit nazvanie zhivotnogo po "),
  nl,write(" ego priznakam. Zashchita ot beliberdy VKLYUCHENA.  "),
  nl,write(" Otvechayte na voprosy : 'y'(Da) ili 'n'(Net).     "),
  nl,write("***************************************************"),
  nl,nl,
  konsultaciya,
  nl,nl,
  write("--- Soderzhimoe bazy dannyh ---"), nl,
  vyvod_bd,
  ochistit,
  write("Nazhmite probel."),nl,
  readchar(_),
  removewindow,
  exit.

konsultaciya:-
  zhivotnoe(X),!,nl,
  write("Rezyume: ", X, ".").
konsultaciya:-
  nl, write("Izvinite, no ya nichem ne mogu vam pomoch."), nl,
  write("I voobshche, gde vy videli takoe zhivotnoe ?..").

sprosit(X,Y):- 
  write(" Vopros: ",X,"  ",Y," ? "),
  readln(Reply),
  zapomnit(X,Y,Reply).

/*        Mehanizm vyvoda        */
da(X,Y):-d_da(X,Y),!.
da(X,Y):-not(net(X,Y)),!, sprosit(X,Y).

net(X,Y):-d_net(X,Y),!.

zapomnit(X,Y,y):-asserta(d_da(X,Y)).
zapomnit(X,Y,n):-asserta(d_net(X,Y)), fail.

vyvod_bd:- d_da(P,Q), write("d_da(",P,", ",Q,")"), nl, fail.
vyvod_bd:- d_net(P,Q), write("d_net(",P,", ",Q,")"), nl, fail.
vyvod_bd. 

ochistit:-retract(d_da(_,_)), fail.
ochistit:-retract(d_net(_,_)), fail.
ochistit. 

/* === BLOK ZASHCHITY OT BELIBERDY === */
zhivotnoe("Eto beliberda! Mlekopitayushchee ne mozhet byt pticey") :-
  kategoriya("mlekopitayushchee"),
  kategoriya("ptica"), !.

zhivotnoe("Eto beliberda! Parnokopytnye iz bazy ne edyat myaso") :-
  kategoriya("parnokopytnoe"),
  kategoriya("hishchnik"), !.

zhivotnoe("Eto beliberda! Ptica ne mozhet imet kopyta") :-
  kategoriya("ptica"),
  kategoriya("parnokopytnoe"), !.


/* === Pravila iz Prilozheniya 2 === */
zhivotnoe("Gepard") :-
  kategoriya("mlekopitayushchee"),
  kategoriya("hishchnik"),
  da(imeet, "zhelto-korichnevyy cvet"),
  da(imeet, "temnye pyatna"),!.

zhivotnoe("Tigr") :-
  kategoriya("mlekopitayushchee"),
  kategoriya("hishchnik"),
  da(imeet, "zhelto-korichnevyy cvet"),
  da(imeet, "temnye polosy"),!.

zhivotnoe("Zhiraf") :-
  kategoriya("parnokopytnoe"),
  da(imeet, "dlinnuyu sheyu"),
  da(imeet, "dlinnye nogi"),
  da(imeet, "chernye pyatna"),!.

zhivotnoe("Zebra") :-
  kategoriya("parnokopytnoe"),
  da(imeet, "chernye polosy"),!.

zhivotnoe("Straus") :-
  kategoriya("ptica"),
  da(mozhet, "ne letat"),
  da(imeet, "dlinnuyu sheyu"),
  da(imeet, "dlinnye nogi"),
  da(imeet, "cherno-beluyu okrasku"),!.

zhivotnoe("Pingvin") :-
  kategoriya("ptica"),
  da(mozhet, "ne letat"),
  da(mozhet, "plavat"),
  da(imeet, "cherno-beluyu okrasku"),!.

zhivotnoe("Albatros") :-
  kategoriya("ptica"),
  da(mozhet, "horosho letat"),!.

kategoriya("mlekopitayushchee") :-
  da(imeet, "volosyanoj pokrov"),!.
kategoriya("mlekopitayushchee") :-
  da(delaet, "daet moloko"),!.

kategoriya("ptica") :-
  da(imeet, "perya"),!.
kategoriya("ptica") :-
  da(mozhet, "letat"),
  da(delaet, "otkladyvaet yayca"),!.

kategoriya("hishchnik") :-
  da(est, "myaso"),!.
kategoriya("hishchnik") :-
  da(imeet, "ostrye zuby"),
  da(imeet, "kogti"),
  da(imeet, "glaza smotryat vpered"),!.

kategoriya("parnokopytnoe") :-
  kategoriya("mlekopitayushchee"),
  da(imeet, "kopyta"),!.
kategoriya("parnokopytnoe") :-
  kategoriya("mlekopitayushchee"),
  da(delaet, "zhuet zhvachku"),!.

/*      konec programmy          */