Witam!
Mam takei zadanie do wykonania na laboratorium z jęz. Prolog:
http://si_lab.webpark.pl/prolog-bloki01.htm

Pierwszą część zadania wykonałem następująco:

domains
	s = symbol
	ls= s*
	i = integer
predicates
	blok(s,i,i,i)
	na(s,s)

	lista(ls,s)
	lewa(ls)
	prawa(ls)
	odstep(s,s)

	niejestna(ls)
	brama(s,s,s)
	pokaz_bramy

	yyy(i,s) % dolne polozenie bloku s
	wybierz(s,ls)
	podstawa(ls,ls)
	okno(s,s,s)
	pokaz_okna
	
clauses
%================ baza danych
blok(a,2,2,5). % nazwa bloku, szerokosc, wysokosc, polozenie poczatku
blok(b,1,2,6).blok(c,5,1,6).blok(d,2,1,10).
blok(e,4,1,10).blok(f,1,1,10).blok(g,2,1,9).
blok(h,1,2,13).blok(i,4,1,10).blok(j,2,1,13).
blok(k,5,1,12).blok(l,1,2,14).blok(m,2,1,14).
blok(n,1,2,14).blok(o,3,1,14).blok(p,1,3,16).

na(b,a). % co lezy na czym
na(c,b).na(c,d).na(d,e).na(e,f).na(e,h).na(f,g).
na(i,c).na(i,j).na(j,k).na(k,e).na(k,l).na(l,m).
na(n,j).na(o,n).na(o,p).na(p,k).
%================ koniec bazy danych

%================= funkcje wspolne
lista([X],X).
lista([G|O],G) :- na(G,X),lista(O,X).
lewa([_]).
lewa([GL,G|OL]) :- blok(GL,W,_,X),blok(G,W1,_,X1),na(GL,G),W+X=W1+X1,lewa([G|OL]).
prawa([_]).
prawa([GP,G|OP]) :- blok(GP,_,_,X),blok(G,_,_,X1),na(GP,G),X=X1,prawa([G|OP]).
odstep(GL,GP) :- blok(GL,W,_,XL),blok(GP,_,_,XP),XL+W<XP.

%================== funkcje bramy
niejestna([X]) :- not(na(X,_)).
niejestna([_|O]) :- niejestna(O).
brama(U,GL,GP) :- na(U,GL),na(U,GP),GL<>GP,
	odstep(GL,GP),
	lista(L,GL),lista(P,GP),
	lewa(L),prawa(P),
	niejestna(L),niejestna(P).

pokaz_bramy :- brama(Y,X,Z),write("LGP: ",X,Y,Z,"\n"),fail.

%================== funkcje okna
yyy(Y,S) :- na(S,T),!,yyy(R,T),blok(T,W,H,X),Y=R+H;Y=1.
wybierz(G,[G|_]).
wybierz(X,[_|O]) :- wybierz(X,O).
podstawa(L,P) :- wybierz(L1,L),wybierz(P1,P),
	na(L1,D1),na(P1,D2),not(odstep(D1,D2)),
	yyy(Y1,D1),yyy(Y2,D2),Y1=Y2.
okno(U,GL,GP) :- na(U,GL),na(U,GP),GL<>GP,
	odstep(GL,GP),
	lista(L,GL),lista(P,GP),
	lewa(L),prawa(P),
	podstawa(L,P).
pokaz_okna :- okno(Y,X,Z),write("LGP: ",X,Y,Z,"\n"),fail.

Za drugą nie wiem, jak się zabrać:

W drugiej części należy zbudować bramę z dostępnych materiałów, tak aby na zapytanie pokaz_bramy program zwrócił wszystkie możliwe bramy. Materiały można obracać i ustawiać w dowolnych miejscach (2 pkt.). material(a,4,1). % nazwa, dlugosc, wysokosc
material(b,3,1).
material(c,2,1).
material(d,1,1).
material(e,1,1).



Nie wiem, jak wygenerować wszystkie możliwe ustawienia bloków, żeby wykryć bramy. Dobrze by było, żeby funkcja generująca ustawienia z materiałów tworzyła bazę blok() i na(), do których mam juz algorytm :] 

Liczę na waszą pomoc! [soczek]