od mifeet » 15. 4. 2010 22:33
Zadání si pamatuji stejně.
1) U prvního úkolu jsem taky použil jenom rozdílové seznamy, větu "Predikát přijímá i neúplně definované struktury" jsem pochopil tak, že převod na normální seznam není nutný.
2) U dvojky bylo v predikátu X1*Y2-X2*Y1 (místo X1*Y2+X2*Y1).
3) Myslím, že ukázkový vstup byl [a-[b/1,c/3],b-[a/2],c-[]]
4) Tady chtěli vrátit seznam všech ohodnocení, která se od původního liší v právě dvou hodnotách, tj. seznam seznamů. A ještě u toho byla poznámka, že na plný počet bodů je to třeba napsat bez bagof & spol.
Moje řešení:
Kód: Vybrat vše
rotace(X-X,X-X) :- var(X).
rotace([X|Xs]-Y,Xs-Z) :- var(Y),Y=[X|Z].
Kód: Vybrat vše
obsah(X,Y) :- obsah(X,0,Y).
obsah([_],A,A).
obsah([v(X1,Y1),v(X2,Y2)|Vs], A, Vysl):-
A1 is A + (X1*Y2-X2*Y1)/2,
obsah([v(X2,Y2)|Vs], A1, Vysl).
Kód: Vybrat vše
otoc(G,TG):-
bezHran(G,BG),
otocHrany(G,BG,TG).
bezHran([],[]).
bezHran([V-_|Xs], [V-[]|Ys]):-bezHran(Xs,Ys).
otocHrany([], A, A):-!.
otocHrany([V-Hrany|Vs], A, Vysl) :-
pridejHrany(V,Hrany,A,A1),
otocHrany(Vs, A1, Vysl).
pridejHrany(_,[],G,G).
pridejHrany(Kam,[V/Vaha|Vs],A,Vysl):-
select(V-Hrany,A,A1),
A2 = [V-[Kam/Vaha|Hrany]|A1],
pridejHrany(Kam,Vs,A2,Vysl).
Kód: Vybrat vše
negace(true,false).
negace(false,true).
insert(X,Is,[X|Is]).
ohod2([V1-H1,V2-H2],[[V1-NH1,V2-NH2]]):-negace(H1,NH1),negace(H2,NH2),!.
ohod2([V1-H1|Vs],Vysl) :-
negace(H1,NH1),
ohod1(Vs,Ts1), maplist(insert(V1-NH1),Ts1,Vysl1),
ohod2(Vs,Ts2), maplist(insert(V1-H1),Ts2,Vysl2),
append(Vysl1,Vysl2,Vysl).
ohod1([V1-H1],[[V1-NH1]]):-negace(H1,NH1),!.
ohod1([V1-H1|Vs],Vysl):-
negace(H1,NH1),
Vysl1=[[V1-NH1|Vs]],
ohod1(Vs,Ts), maplist(insert(V1-H1),Ts,Vysl2),
append(Vysl1,Vysl2,Vysl).
Zadání si pamatuji stejně.
1) U prvního úkolu jsem taky použil jenom rozdílové seznamy, větu "Predikát přijímá i neúplně definované struktury" jsem pochopil tak, že převod na normální seznam není nutný.
2) U dvojky bylo v predikátu X1*Y2-X2*Y1 (místo X1*Y2+X2*Y1).
3) Myslím, že ukázkový vstup byl [a-[b/1,c/3],b-[a/2],c-[]]
4) Tady chtěli vrátit seznam všech ohodnocení, která se od původního liší v právě dvou hodnotách, tj. seznam seznamů. A ještě u toho byla poznámka, že na plný počet bodů je to třeba napsat bez bagof & spol.
Moje řešení:
[list=1]
[*][code]
rotace(X-X,X-X) :- var(X).
rotace([X|Xs]-Y,Xs-Z) :- var(Y),Y=[X|Z].
[/code]
[*][code]
obsah(X,Y) :- obsah(X,0,Y).
obsah([_],A,A).
obsah([v(X1,Y1),v(X2,Y2)|Vs], A, Vysl):-
A1 is A + (X1*Y2-X2*Y1)/2,
obsah([v(X2,Y2)|Vs], A1, Vysl).
[/code]
[*][code]
otoc(G,TG):-
bezHran(G,BG),
otocHrany(G,BG,TG).
bezHran([],[]).
bezHran([V-_|Xs], [V-[]|Ys]):-bezHran(Xs,Ys).
otocHrany([], A, A):-!.
otocHrany([V-Hrany|Vs], A, Vysl) :-
pridejHrany(V,Hrany,A,A1),
otocHrany(Vs, A1, Vysl).
pridejHrany(_,[],G,G).
pridejHrany(Kam,[V/Vaha|Vs],A,Vysl):-
select(V-Hrany,A,A1),
A2 = [V-[Kam/Vaha|Hrany]|A1],
pridejHrany(Kam,Vs,A2,Vysl).
[/code]
[*][code]
negace(true,false).
negace(false,true).
insert(X,Is,[X|Is]).
ohod2([V1-H1,V2-H2],[[V1-NH1,V2-NH2]]):-negace(H1,NH1),negace(H2,NH2),!.
ohod2([V1-H1|Vs],Vysl) :-
negace(H1,NH1),
ohod1(Vs,Ts1), maplist(insert(V1-NH1),Ts1,Vysl1),
ohod2(Vs,Ts2), maplist(insert(V1-H1),Ts2,Vysl2),
append(Vysl1,Vysl2,Vysl).
ohod1([V1-H1],[[V1-NH1]]):-negace(H1,NH1),!.
ohod1([V1-H1|Vs],Vysl):-
negace(H1,NH1),
Vysl1=[[V1-NH1|Vs]],
ohod1(Vs,Ts), maplist(insert(V1-H1),Ts,Vysl2),
append(Vysl1,Vysl2,Vysl).
[/code][/list]