Ifi6057lab3demo1

Allikas: Lambda

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).