Perl 6
Perl 6
Perl 6
Transform your PDFs into Flipbooks and boost your revenue!
Leverage SEO-optimized Flipbooks, powerful backlinks, and multimedia content to professionally showcase your products and significantly increase your reach.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
<strong>Perl</strong> 6<br />
Today, Pugs stands as the most<br />
complete <strong>Perl</strong> 6 implementation<br />
(although others are on the way) and<br />
as a test bed for tests and working out<br />
design details.<br />
— Randall Schwartz<br />
Från pugscode.org:<br />
”Pugs is an implementation of <strong>Perl</strong> 6, written in<br />
Haskell. It aims to implement the full <strong>Perl</strong>6<br />
specification, ...”
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Kodexempel<br />
• Se ”kursmaterial” på kurshemsidan.<br />
• eller /info/progp06/prolog.<br />
• Där finns nu starwars.pl, tree.pl,<br />
mm.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Labbinfo<br />
• Lab 3: På tisdag, 10/10, kl 8–10.<br />
• Lab 4: Måndagen veckan därpå,<br />
16/10, 8–10.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Schemat framöver<br />
10/10 F12 Särskild genomgång för lab 2?<br />
25/10 F13 Differenslistor, avslutning prolog<br />
26/10 F14 Syntaxanalys<br />
27/10 F15 Syntaxanalys<br />
2/11 F16 Syntaxanalys<br />
Alexander Baltatzis:<br />
6/11 AF1 C-programmering<br />
13/11 AF2<br />
14/11 AF3 Internetprogrammering<br />
29/11 AF4
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Senast<br />
• Negationer<br />
virginBirth(X) :mother(_,<br />
X), \+ father(_, X).<br />
| ?- virginBirth(X).<br />
X = anakin ? n<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Senast<br />
• Negationer<br />
virginBirth(X) :mother(_,<br />
X), \+ father(_, X).<br />
| ?- virginBirth(X).<br />
X = anakin ? n<br />
no<br />
• Negationer kan ställa till det: Antagande om<br />
en sluten värld.<br />
likes(ann, pears).<br />
likes(bo, pears).<br />
| ?- likes(cia, pears).<br />
no<br />
| ?- \+ likes(X, pears).<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Senast<br />
• Snitt (eng: cut) begränsar ”backtracking”:<br />
Har vi hittat en lösning så är det bra.<br />
permSort(X, Y) :permutation(X,<br />
Y), ordered(Y), !.<br />
permutation<br />
permSort<br />
ordered<br />
!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Senast<br />
• Snitt (eng: cut) begränsar ”backtracking”:<br />
Har vi hittat en lösning så är det bra.<br />
permSort(X, Y) :permutation(X,<br />
Y), ordered(Y), !.<br />
permutation<br />
permSort<br />
ordered<br />
• Gröna snitt: Påverkar inte programmets<br />
funktion.<br />
!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Senast<br />
• Snitt (eng: cut) begränsar ”backtracking”:<br />
Har vi hittat en lösning så är det bra.<br />
permSort(X, Y) :permutation(X,<br />
Y), ordered(Y), !.<br />
permutation<br />
permSort<br />
ordered<br />
• Gröna snitt: Påverkar inte programmets<br />
funktion.<br />
• Röda snitt: Förändrar programmets logiska<br />
läsning.<br />
!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
• Fler predikat.<br />
• Några exempel.<br />
Idag<br />
• Programmeringsstil: Generera och testa.<br />
Används i lab 4 och 5.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
• setof<br />
• bagof<br />
• findall<br />
Några predikat
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
setof<br />
| ?- setof(X, powerful(X), Ps).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
setof<br />
| ?- setof(X, powerful(X), Ps).<br />
Ps = [dartVader,darthMaul,darthSidious,<br />
obiwan,quigon,yoda] ?<br />
yes
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
wealthy(jean).<br />
healthy(jean).<br />
healthy(joan).<br />
wealthy(jane).<br />
happy(X) :wealthy(X).<br />
happy(X) :healthy(X).<br />
bagof
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
wealthy(jean).<br />
healthy(jean).<br />
healthy(joan).<br />
wealthy(jane).<br />
happy(X) :wealthy(X).<br />
happy(X) :healthy(X).<br />
bagof<br />
| ?- happy(X).<br />
X = jean ? n<br />
X = jane ? n<br />
X = jean ? n<br />
X = joan ? n<br />
no<br />
| ?- bagof(X, happy(X), L).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
wealthy(jean).<br />
healthy(jean).<br />
healthy(joan).<br />
wealthy(jane).<br />
happy(X) :wealthy(X).<br />
happy(X) :healthy(X).<br />
bagof<br />
| ?- happy(X).<br />
X = jean ? n<br />
X = jane ? n<br />
X = jean ? n<br />
X = joan ? n<br />
no<br />
| ?- bagof(X, happy(X), L).<br />
L = [jean,jane,jean,joan] ? n<br />
no<br />
| ?-
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
wealthy(jean).<br />
healthy(jean).<br />
healthy(joan).<br />
wealthy(jane).<br />
happy(X) :wealthy(X).<br />
happy(X) :healthy(X).<br />
bagof<br />
| ?- happy(X).<br />
X = jean ? n<br />
X = jane ? n<br />
X = jean ? n<br />
X = joan ? n<br />
no<br />
| ?- bagof(X, happy(X), L).<br />
L = [jean,jane,jean,joan] ? n<br />
no<br />
| ?- setof(X, happy(X), L).<br />
L = [jane,jean,joan] ? n<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
wealthy(jean).<br />
healthy(jean).<br />
healthy(joan).<br />
wealthy(jane).<br />
happy(X) :wealthy(X).<br />
happy(X) :healthy(X).<br />
bagof<br />
| ?- happy(X).<br />
X = jean ? n<br />
X = jane ? n<br />
X = jean ? n<br />
X = joan ? n<br />
no<br />
| ?- bagof(X, happy(X), L).<br />
L = [jean,jane,jean,joan] ? n<br />
no<br />
| ?- setof(X, happy(X), L).<br />
L = [jane,jean,joan] ? n<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
bagof och setof med en fri parameter<br />
| ?- bagof(P, parent(P, C) , L).<br />
C = anakin,<br />
L = [schmi] ?
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
bagof och setof med en fri parameter<br />
| ?- bagof(P, parent(P, C) , L).<br />
C = anakin,<br />
L = [schmi] ? n<br />
C = leia,<br />
L = [padme,anakin] ?
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
bagof och setof med en fri parameter<br />
| ?- bagof(P, parent(P, C) , L).<br />
C = anakin,<br />
L = [schmi] ? n<br />
C = leia,<br />
L = [padme,anakin] ? n<br />
C = luke,<br />
L = [padme,anakin] ? n<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
findall<br />
| ?- findall(P, parent(P, C) , L).<br />
L = [padme,padme,anakin,schmi,anakin] ? n<br />
no<br />
| ?-
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
findall<br />
| ?- findall(P, parent(P, C) , L).<br />
L = [padme,padme,anakin,schmi,anakin] ? n<br />
no<br />
| ?- findall(P, parent(P, C) , L),<br />
setof(M, member(M, L), Ms).<br />
L = [padme,padme,anakin,schmi,anakin],<br />
Ms = [anakin,padme,schmi] ? n<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Generera och testa<br />
• Programstruktur:<br />
searchProblem(X) :generate(X),<br />
testSolution(X).<br />
• Används i lab 4.<br />
• Läs avsnitt 5.1 i labbhäftet!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelproblem: Bordsplacering<br />
• Antag k gäster runt ett långbord.<br />
• Vill undvika att placera vissa bredvid<br />
varandra.<br />
• Vissa par ska placeras bredvid varandra.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
bordsplacering(Personer, Villkor, Bord) :permutation(Personer,<br />
Placering),<br />
uppfyller(Villkor, Bord).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
bordsplacering(Personer, Villkor, Bord) :permutation(Personer,<br />
Placering),<br />
uppfyller(Villkor, Bord).<br />
• Personer: [ann, bo, cia, ...]<br />
• Otillåtet par: o(ann, bo)<br />
• Intillsittande par: i(cia, dan)
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
bordsplacering(Personer, Villkor, Bord) :permutation(Personer,<br />
Placering),<br />
uppfyller(Villkor, Bord).<br />
• Personer: [ann, bo, cia, ...]<br />
• Otillåtet par: o(ann, bo)<br />
• Intillsittande par: i(cia, dan)<br />
uppfyller([], _).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
bordsplacering(Personer, Villkor, Bord) :permutation(Personer,<br />
Placering),<br />
uppfyller(Villkor, Bord).<br />
• Personer: [ann, bo, cia, ...]<br />
• Otillåtet par: o(ann, bo)<br />
• Intillsittande par: i(cia, dan)<br />
uppfyller([], _).<br />
uppfyller([i(A, B)|Cs], Pl) :intill(A,<br />
B, Pl),<br />
uppfyller(Cs, Pl).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
bordsplacering(Personer, Villkor, Bord) :permutation(Personer,<br />
Placering),<br />
uppfyller(Villkor, Bord).<br />
• Personer: [ann, bo, cia, ...]<br />
• Otillåtet par: o(ann, bo)<br />
• Intillsittande par: i(cia, dan)<br />
uppfyller([], _).<br />
uppfyller([i(A, B)|Cs], Pl) :intill(A,<br />
B, Pl),<br />
uppfyller(Cs, Pl).<br />
uppfyller([o(A, B)|Cs], Pl) :ejintill(A,<br />
B, Pl),<br />
uppfyller(Cs, Pl).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Probleminstans<br />
personer([ann, bo, cia, dan, eje,<br />
fia, gu, han, ia]).<br />
bivillkor([i(cia, dan),<br />
o(ann, bo),<br />
i(eje, bo),<br />
o(gu, han),<br />
o(ia, gu)]).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Probleminstans<br />
personer([ann, bo, cia, dan, eje,<br />
fia, gu, han, ia]).<br />
bivillkor([i(cia, dan),<br />
o(ann, bo),<br />
i(eje, bo),<br />
o(gu, han),<br />
o(ia, gu)]).<br />
| ?- personer(P), bivillkor(C),<br />
bordsplacering(P, C, Pl).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Probleminstans<br />
personer([ann, bo, cia, dan, eje,<br />
fia, gu, han, ia]).<br />
bivillkor([i(cia, dan),<br />
o(ann, bo),<br />
i(eje, bo),<br />
o(gu, han),<br />
o(ia, gu)]).<br />
| ?- personer(P), bivillkor(C),<br />
bordsplacering(P, C, Pl).<br />
C = [i(cia,dan),o(ann,bo),i(eje,bo),<br />
o(gu,han),o(ia,gu)],<br />
P = [ann,bo,cia,dan,eje,fia,gu,han,ia],<br />
Pl = [ann,cia,dan,bo,eje,gu,fia,han,ia] ?<br />
yes
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Praktisk lösning?<br />
• Lösningsgenerering ej effektiv!<br />
• Jämförbar med ”permutation sort”.<br />
• Måste generera smartare!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Sudoku<br />
6 8 7 9<br />
1 2 8<br />
9<br />
6 2 4<br />
4 3<br />
3 7 6<br />
9<br />
7 3 1<br />
9 3 6 8<br />
Placera ut<br />
siffrorna 1 – 9 så<br />
att varje siffra<br />
återfinns endast<br />
en gång i varje<br />
rad, kolumn, och<br />
delkvadrat.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ansats med generera/testa<br />
sudoku(S) :transform(S,<br />
ByColumn, BySubsquare),<br />
verifyLists(S),<br />
verifyLists(ByColumn),<br />
verifyLists(BySubsquare).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ansats med generera/testa<br />
sudoku(S) :transform(S,<br />
ByColumn, BySubsquare),<br />
verifyLists(S),<br />
verifyLists(ByColumn),<br />
verifyLists(BySubsquare).<br />
verifyLists([]).<br />
verifyLists([L|Ls]) :verifyList(L),<br />
verifyLists(Ls).<br />
verifyList(L) :permutation([1,2,3,4,5,6,7,8,9],<br />
L).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
transform([[X11,X12,X13,X14,X15,X16,X17,X18,X19],<br />
[X21,X22,X23,X24,X25,X26,X27,X28,X29],<br />
[X31,X32,X33,X34,X35,X36,X37,X38,X39],<br />
[X41,X42,X43,X44,X45,X46,X47,X48,X49],<br />
[X51,X52,X53,X54,X55,X56,X57,X58,X59],<br />
[X61,X62,X63,X64,X65,X66,X67,X68,X69],<br />
[X71,X72,X73,X74,X75,X76,X77,X78,X79],<br />
[X81,X82,X83,X84,X85,X86,X87,X88,X89],<br />
[X91,X92,X93,X94,X95,X96,X97,X98,X99]],<br />
[[X11,X21,X31,X41,X51,X61,X71,X81,X91],<br />
[X12,X22,X32,X42,X52,X62,X72,X82,X92],<br />
[X13,X23,X33,X43,X53,X63,X73,X83,X93],<br />
[X14,X24,X34,X44,X54,X64,X74,X84,X94],<br />
[X15,X25,X35,X45,X55,X65,X75,X85,X95],<br />
[X16,X26,X36,X46,X56,X66,X76,X86,X96],<br />
[X17,X27,X37,X47,X57,X67,X77,X87,X97],<br />
[X18,X28,X38,X48,X58,X68,X78,X88,X98],<br />
[X19,X29,X39,X49,X59,X69,X79,X89,X99]],<br />
[[X11,X12,X13, X21,X22,X23, X31,X32,X33],<br />
[X14,X15,X16, X24,X25,X26, X34,X35,X36],<br />
[X17,X18,X19, X27,X28,X29, X37,X38,X39],<br />
[X41,X42,X43, X51,X52,X53, X61,X62,X63],<br />
[X44,X45,X46, X54,X55,X56, X64,X65,X66],<br />
[X47,X48,X49, X57,X58,X59, X67,X68,X69],<br />
[X71,X72,X73, X81,X82,X83, X91,X92,X93],<br />
[X74,X75,X76, X84,X85,X86, X94,X95,X96],<br />
[X77,X78,X79, X87,X88,X89, X97,X98,X99]]).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)<br />
• Långsamt att lösa en sudoku!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)<br />
• Långsamt att lösa en sudoku!<br />
• Klarar bara ett litet antal okända (klarar inte<br />
ICAs ”enkla” sudoku med 45 okända)
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)<br />
• Långsamt att lösa en sudoku!<br />
• Klarar bara ett litet antal okända (klarar inte<br />
ICAs ”enkla” sudoku med 45 okända)<br />
• Kusoffsky: ”17 okända går på några<br />
sekunder”
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)<br />
• Långsamt att lösa en sudoku!<br />
• Klarar bara ett litet antal okända (klarar inte<br />
ICAs ”enkla” sudoku med 45 okända)<br />
• Kusoffsky: ”17 okända går på några<br />
sekunder”<br />
• Vad göra?
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Hur funkar det?<br />
• Testning snabbt (”är detta en sudoku?”)<br />
• Långsamt att lösa en sudoku!<br />
• Klarar bara ett litet antal okända (klarar inte<br />
ICAs ”enkla” sudoku med 45 okända)<br />
• Kusoffsky: ”17 okända går på några<br />
sekunder”<br />
• Vad göra?<br />
• Generera smartare!
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Färga en karta<br />
• Sats: Varje planär graf kan färgas med fyra<br />
färger.<br />
• Alltså: Varje karta kan färgas med fyra<br />
färger.<br />
• Skriv ett program som färgar en karta!<br />
(Från Sterling-Shapiro: The Art of Prolog)
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Datastruktur<br />
region(Area, AreaColor, NeighborColors).<br />
Exempelinstans:<br />
[region(a, A, [B,C,D]),<br />
region(b, B, [A, C, D]),<br />
region(c, C, [A,B,D,E,F]),<br />
region(d, D, [A,C, F]),<br />
region(e, E, [B, C, F]),<br />
region(f, F, [C, D, E])]
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
En bit av Europa<br />
map(europe,<br />
[region(portugal, P, [E]),<br />
region(spain, E, [F, P]),<br />
region(france, F, [E, I, S, B, G, L]),<br />
region(belgium, B, [F, H, L, G]),<br />
region(holland, H, [B, G]),<br />
region(germany, G, [F, A, S, H, B, L]),<br />
region(luxembourg,L,[F, B, G]),<br />
region(italy, I, [F, A, S]),<br />
region(switzerl, S, [F, I, A, G]),<br />
region(austria, A, [I, S, G])])<br />
).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Programmet<br />
% colorMap(Map, ColorList)<br />
% För varje region: Välj en färg<br />
colorMap([],_).<br />
colorMap([Region|Regions], Colors) :colorRegion(Region,<br />
Colors),<br />
colorMap(Regions, Colors).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Programmet<br />
% colorMap(Map, ColorList)<br />
% För varje region: Välj en färg<br />
colorMap([],_).<br />
colorMap([Region|Regions], Colors) :colorRegion(Region,<br />
Colors),<br />
colorMap(Regions, Colors).<br />
% colorRegion(Region, ColorList)<br />
% En region tar en färg och kräver att grannregionerna<br />
% inte använder den färgen<br />
colorRegion(region(Name,<br />
Color,<br />
Neighbors), Colors) :select(Color,<br />
Colors, Colors1), %Generera<br />
members(Neighbors, Colors1). %Testa
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelkörning<br />
| ?- map(europe, M),<br />
colorMap(M, [red,blue,green,yellow]).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelkörning<br />
| ?- map(europe, M),<br />
colorMap(M, [red,blue,green,yellow]).<br />
M = [region(portugal,red,[blue]),region(spain,blue,[red,<br />
egion(belgium,blue,[red,red,green,yellow]),region(hollan<br />
...]),region(luxembourg,green,[red,blue,yellow]),region(<br />
ion(...)] ?<br />
yes<br />
| ?-
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelkörning<br />
| ?- map(europe, M),<br />
colorMap(M, [red,blue,green,yellow]).<br />
M = [region(portugal,red,[blue]),region(spain,blue,[red,<br />
egion(belgium,blue,[red,red,green,yellow]),region(hollan<br />
...]),region(luxembourg,green,[red,blue,yellow]),region(<br />
ion(...)] ?<br />
yes<br />
| ?- map(europe, M),<br />
colorMap(M, [red,blue,green]).<br />
no
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Om programmet<br />
• Implementerar en snål algoritm.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Om programmet<br />
• Implementerar en snål algoritm.<br />
• Riskerar vara ineffektiv.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Om programmet<br />
• Implementerar en snål algoritm.<br />
• Riskerar vara ineffektiv.<br />
• Fler färger ⇒ snabbare
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning<br />
• Intressant detalj: Ordningen är delvis<br />
konserverad
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning<br />
• Intressant detalj: Ordningen är delvis<br />
konserverad<br />
• Betrakta ett genom:<br />
1 2<br />
3<br />
4<br />
5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning<br />
• Intressant detalj: Ordningen är delvis<br />
konserverad<br />
• Betrakta ett genom:<br />
1 2<br />
• Se genomet som en permutation av gener:<br />
3<br />
4<br />
(1, 2, 3, 4, 5)<br />
5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning<br />
• Intressant detalj: Ordningen är delvis<br />
konserverad<br />
• Betrakta ett genom:<br />
1 2<br />
• Se genomet som en permutation av gener:<br />
• Liknande genom:<br />
3<br />
4<br />
(1, 2, 3, 4, 5)<br />
(1, 4, 3, 2, 5)<br />
5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Exempelprogram: Sortera gener<br />
• Vitt skilda organismer har mycket lika<br />
genuppsättning<br />
• Intressant detalj: Ordningen är delvis<br />
konserverad<br />
• Betrakta ett genom:<br />
1 2<br />
• Se genomet som en permutation av gener:<br />
• Liknande genom:<br />
3<br />
4<br />
(1, 2, 3, 4, 5)<br />
(1, 4, 3, 2, 5)<br />
5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.<br />
• Hur många inversioner har krävts för att<br />
komma från ett genom till ett annat?
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.<br />
• Hur många inversioner har krävts för att<br />
komma från ett genom till ett annat?<br />
• Heuristik: Plocka bort brytpunkter.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.<br />
• Hur många inversioner har krävts för att<br />
komma från ett genom till ett annat?<br />
• Heuristik: Plocka bort brytpunkter.<br />
• Brytpunkt: När två intilliggande gener inte<br />
har närliggande tal<br />
1 4 3 2 5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.<br />
• Hur många inversioner har krävts för att<br />
komma från ett genom till ett annat?<br />
• Heuristik: Plocka bort brytpunkter.<br />
• Brytpunkt: När två intilliggande gener inte<br />
har närliggande tal<br />
1|4 3 2|5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Ett beräkningsproblem<br />
• Antalet inversioner är proportionellt mot<br />
tiden sedan artdelningen.<br />
• Hur många inversioner har krävts för att<br />
komma från ett genom till ett annat?<br />
• Heuristik: Plocka bort brytpunkter.<br />
• Brytpunkt: När två intilliggande gener inte<br />
har närliggande tal<br />
1|4 3 2|5<br />
1 2 3 4 5
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6<br />
• Om det finns en inversion som plockar bort<br />
två brytpunkter, ta den.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6<br />
• Om det finns en inversion som plockar bort<br />
två brytpunkter, ta den.<br />
• Annars, om det finns en inversion som<br />
plockar bort en brytpunkt, ta den.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6<br />
• Om det finns en inversion som plockar bort<br />
två brytpunkter, ta den.<br />
• Annars, om det finns en inversion som<br />
plockar bort en brytpunkt, ta den.<br />
• Iterera tills inga fler brytpunkter.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6<br />
• Om det finns en inversion som plockar bort<br />
två brytpunkter, ta den.<br />
• Annars, om det finns en inversion som<br />
plockar bort en brytpunkt, ta den.<br />
• Iterera tills inga fler brytpunkter.
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Heuristiken<br />
• Om n gener, lägg till 0 och n + 1:<br />
5, 4, 3, 2, 1 ⇒ 0, 5, 4, 3, 2, 1, 6<br />
• Om det finns en inversion som plockar bort<br />
två brytpunkter, ta den.<br />
• Annars, om det finns en inversion som<br />
plockar bort en brytpunkt, ta den.<br />
• Iterera tills inga fler brytpunkter.<br />
Obs: Ej optimalt!<br />
Alltför beräkningskrävande att lösa optimalt
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
sortByInversions(L, []) :countBreakpoints(L,<br />
N), N=0.<br />
sortByInversions(Perm, [NextPerm|StateList]) :removeBreakpoints(Perm,<br />
NextPerm),<br />
sortByInversions(NextPerm, StateList).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Huvudprogram<br />
sortByInversions(L, []) :countBreakpoints(L,<br />
N), N=0.<br />
sortByInversions(Perm, [NextPerm|StateList]) :removeBreakpoints(Perm,<br />
NextPerm),<br />
sortByInversions(NextPerm, StateList).<br />
removeBreakpoints(L, NextL) :findInversionTwo(L,<br />
NextL), !.<br />
removeBreakpoints(L, NextL) :findInversionOne(L,<br />
NextL).
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Testfall<br />
Genom A: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10<br />
Genom B: 9, 2, 1, 6, 5, 4, 3, 8, 7, 10
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Testfall<br />
Genom A: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10<br />
Genom B: 9, 2, 1, 6, 5, 4, 3, 8, 7, 10<br />
| ?- p4(X), inversions(X, N).<br />
.9.1........<br />
...96.43....<br />
.......9.7..<br />
N = 3,<br />
X = [9,2,1,6,5,4,3,8,7,10] ?<br />
yes
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Testfall<br />
Genom A: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10<br />
Genom B: 9, 2, 1, 6, 5, 4, 3, 8, 7, 10<br />
| ?- p4(X), inversions(X, N).<br />
.9.1........<br />
...96.43....<br />
.......9.7..<br />
N = 3,<br />
X = [9,2,1,6,5,4,3,8,7,10] ?<br />
yes<br />
9, 2, 1, 6, 5, 4, 3, 8, 7, 10<br />
1, 2, 9, 6, 5, 4, 3, 8, 7, 10<br />
1, 2, 3, 4, 5, 6, 9, 8, 7, 10<br />
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Intro Några predikat Generera och testa Exempelprogram: Sortera gener<br />
Om algoritmen<br />
• Exempel på ickedeterministisk<br />
programmering<br />
• Fungerar i praktiken