04.05.2013 Views

Perl 6

Perl 6

Perl 6

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!