Ifi6057lab3demo1

Allikas: Lambda
Redaktsioon seisuga 18. november 2015, kell 20:17 kasutajalt PriitJ (arutelu | kaastöö)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribale Mine otsikasti

Elementaarne Prolog: surelikud filosoofid.

mortal(X):-
  person(X).
mortal(X):-
  dead(X).
person(sokrates).
dead(platon).

Iseseisev agent kollimaailmas. Suht poolik, aga suudab auke vältida. move(M, 2). küsib, mis on õige käik ajahetkel 2. See järgib teadmusbaasiga agendi arhitektuuri, kus olek ajas muutub ning tegevusi järeldatakse vastavalt hetkeolukorrale. Peale käiku peaks agendile tellkb(breeze(2)). stiilis ütlema, mida tema sensorid tajuvad (tellkb/1: lisa asju teadmusbaasi).

:- dynamic(breeze/1).
:- dynamic(stench/1).
:- dynamic(agentpos/3).
agentpos(1,1,1).

breezy(X, Y):-
  agentpos(X, Y, T),
  breeze(T).

smelly(X, Y):-
  agentpos(X, Y, T),
  stench(T).

nopit(X, Y):-
  visited(L, Y),
  X is L + 1,
  \+  breezy(L, Y).

nopit(X, Y):-
  visited(R, Y),
  X is R - 1,
  \+  breezy(R, Y).

nopit(X, Y):-
  visited(X, U),
  Y is U - 1,
  \+  breezy(X, U).

nopit(X, Y):-
  visited(X, D),
  Y is D + 1,
  \+  breezy(X, D).

% kuna me kasutame agentpos-i, siis me oskame sealt uusi koordinaate
% tuletada ja legal/1 predikaadiga kontrollida. Alternatiiv oleks Prologile
% lihtsalt ütelda, mis koordinaadid olemas on.
%coord(1).
%coord(2).
%coord(3).
%coord(4).

legal(X):-
  X > 0,
  X < 5.

visited(X, Y):-
  agentpos(X, Y, _).

safe(X, Y):-
  visited(X, Y).

safe(X, Y):-
  nopit(X, Y).
%  nowumpus(X, Y).

ismove(up).
ismove(left).
ismove(right).
ismove(down).


newpos(X, Y, up, T):-
  agentpos(X, D, P),
  Y is D + 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, left, T):-
  agentpos(R, Y, P),
  X is R - 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, right, T):-
  agentpos(L, Y, P),
  X is L + 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, down, T):-
  agentpos(X, U, P),
  Y is U - 1,
  T is P + 1,
  legal(Y).

% küsi järgmist käiku, näit. move(M, 2).
move(M, T):-
  ismove(M),
  newpos(X, Y, M, T),
  safe(X, Y),
  tellkb(agentpos(X, Y, T)).

% anna teada uusi fakte, näit. tellkb(breeze(2)).
tellkb(X):-
  asserta(X).