Pallos Peter <pallosp(a)freeweb.hu> writes:
Hello!
Írtam néhány predikátumot, ami egy mátrixnak összegyûjti az összes
2x2-es blokkját, majd ezekre felvesz egy korlátot.
Hogyan lehetne kiküszöbölni a keletkezõ választási pontokat? A
blokkokat gyûjtsem listába, vagy van más megoldás is?
Gyujtheted, de vigyazz, mivel valtozok vannak a blokkokban, findall nem jo,
mert nem orzi meg a valtozok identitasat, helyette bagof kell, lasd
alabb. Ha egy kicsit is nagyobb a matrixod, a sok valtozo miatt (*) a bagof
eleg lassuva es memoriaigenyesse valik. Ugyhogy az igazi megoldas sajnos az
SML-szeru rekurziv kigyujtese a blokkoknak...
-Peter
| ?- matrix_of_vars(2,2, L), findall(B, block2x2(L, B), Bs).
L = [[_A,_B],[_C,_D]],
Bs = [block(_E,_F,_G,_H)] ?
yes
% source_info
| ?- matrix_of_vars(2,2, L), bagof(B, block2x2(L, B), Bs).
L = [[_A,_B],[_C,_D]],
Bs = [block(_A,_B,_C,_D)] ?
yes
(*)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{A {\tt bagof(?Gyûjtõ, :Cél, ?Lista)} beépített eljárás}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{itemize}
\item Az eljárás végrehajtása (procedurális szemantikája):
\begin{itemize}
\item a \cd{Cél} kifejezést eljáráshívásként értelmezi, meghívja;
\item összegyûjti a megoldásait {(a \cd{Gyûjtõ}-t és a szabad változók
behelyettesítéseit)};
\item a szabad változók összes
behelyettesítését {\em felsorolja} és mindegyikhez a {\tt Lista}-ban
megadja az összes hozzá tartozó {\tt Gyûjtõ} értéket.
\end{itemize}