04.05.2013 Views

Perl 6

Perl 6

Perl 6

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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!