Logični problemi in igre

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje
Članek govori o logičnih problemih in igrah v programskem jeziku Prolog.

Prolog se uporablja pri reševanju logičnih problemov in za implementiranje strategij igranja logičnih iger. Če postavimo prologu vprašanje, kdo je sin Tonetove, mame, a ni Tonetov brat:

?- mama(M,tone) ,sin(X,M),not(brat (X,tone)).

bo prolog pravilno odgovoril:

M = marija
X = tone

Igra z vžigalicami

Imamo poljubno število kupčkov spoljubnim številom vžigalic. Vsak igralec v eni potezi vzame neničelno število vžigalic z enega kupčka (lahko tudi cel kupček). Zgubi tisti, ki prvi nima poteze.

poteza(S,X,S1) :-
  brisi(X,S,S1).% izprazni kupček
poteza(S,X,[Y1|S1]) : -
  brisi(Y,S,S1), % vzemi kupček
  med(X,0,Y),% vrni zmanjšan kupček
  Y1 is Y - X;

brisi(X,[X|R],R).
brisi(X,[Y|R],[Y|R1]) :-
  brisi(X,R,R1).
?- poteza([2,1],X,S).
S = [1];
S = [2];
S = [1,1];
no


Iskanje zmagovite poteze s preiskovanjem celotnega drevesa:

%zmaga(Seznam_kupčkov, Vzeto_št_vžigalic, Nov_seznam)
zmaga([X],X,[]) .% robni pogoj
zmaga(Sez,X,Sez1) :-
  poteza(Sez,X,Sez1),   % napravi potezo tako, da
  not(zmaga(Sez1,_,_)). % nasprotnik ne more zmagati


Izpolnjevanje logičnih izrazov

Procedura izpolni bo pri danem logičnem izrazu poiskala take vrednosti logičnih spremenljivk, da je izraz resničen:

?- izpolni(A & B <=> C).
A = true
B = true
C = true;
A = false
B = true
C = false;
A = false
B = false
C = false;
A = true
B = false
C = false;
no


:- op(200,fy, neg).
:- op(300,xfy, & ).
:- op(400,xfy, v ).
:- op(500,xfx, => ).
:- op(600,xfx, <=> ).
izpolni(true).
izpolni(X & Y) :-
  izpolni(X),
  izpolni(Y).
izpolni(X v Y) :-
  izpolni(X);
  izpolni(Y).
izpolni(X => Y) :-
  izpolni(Y v neg X).
izpolni(X <=> Y) :-
  izpolni((Y => X) & (X => Y)).
izpolni(neg X) :-
  ne_izpolni(X).

ne_izpolni (false).
ne_izpolni(X & Y) :-
  ne_izpolni(X);
  ne_izpolni(Y).
ne_izpolni(X v Y) :-
  ne_izpolni(X),
  ne_izpolni(Y).
ne_izpolni(X => Y) :-
  ne_izpolni(Y v neg X).
ne_izpolni(X <=> Y) :-
  ne_izpolni((Y => X) & (X => Y)).
ne_izpolni(neg X) :-
  izpolni(X).
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja