Megoldásgyűjtő beépített eljárások

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


findall(Gyűjtő, Cél, Lista)

A Cél kifejezést eljáráshívásként értelmezi, meghívja és minden egyes megoldásához előállítja Gyűjtő egy másolatát (vagyis a megoldásban levő változókat új változókra cseréli).

Példa:

:- findall(X, (member(X, [1,7,8,3,2,4]), X>3), L).
L = [7,8,4] ?
:- findall(X-Y, (between(1,3,X), between(1,X,Y)), L).
L = [1-1, 2-1, 2-2, 3-1, 3-2, 3-3] ? 

bagof(Gyűjtő, Cél, Lista)

A Cél kifejezést eljáráshívásként értelmezi és összegyűjti a megoldásait. Azonban ha a Cél-ban vannak olyan üres változók, amelyek a Gyűjtő-ben nem szerepelnek, akkor ezek minden behelyettesítését felsorolja és külön-külön mindegyikhez összegyűjti a Gyűjtő összes megoldását Lista-ba.

Ha a második argumentum V1^...Vn^Cél alakú, akkor a V1, ..., Vn változók behelyettesítéseit nem sorolja fel.

Különbségek a findall-hoz képest:

  • Ha Cél-nak nincs megoldása, findall üres listát ad, bagof meghiúsul.
  • Ha Gyűjtő nem tömör, akkor
    • findall ezeket megoldásonként szisztematikusan új változókra cseréli.
    • bagof megőrzi a változókat.
  • A bagof végrehajtása időigényesebb.
gráf([a-b, a-c, b-c, c-d, b-d]).

| :- gráf(_G), findall(B, member(A-B, _G), VegP).
VegP = [b,c,c,d,d] ? ;
no

| :- gráf(_G), bagof(B, member(A-B, _G), VegP).
A = a, VegP = [b,c] ? ;
A = b, VegP = [c,d] ? ;
A = c, VegP = [d] ? ;
no

setof(Gyűjtő, Cél, Lista)

Tulajdonképpen ugyanaz, mint a bagof, de az eredménylistát rendezi, és kiszűri az ismétlődéseket.