od awk » 26. 6. 2019 07:47
Přidávám ještě moje řešení malých příkladů.
- Prolog: Generování výrokových formulí (5 bodů)
Kód: Vybrat vše
gen(1, Jmena, var(J)) :- !, member(J, Jmena).
gen(2, Jmena, not(P)) :- !, gen(1, Jmena, P).
gen(N, Jmena, V) :-
N > 2,
B is N-2,
C is N-1,
between(1,B,X),
D is C - X,
gen(X, Jmena, P),
gen(D, Jmena, F),
( V = and(F,P) ; V = or(F,P) ).
gen(N, Jmena, not(E)) :-
N > 2,
A is N-1,
gen(A, Jmena, E).
- Prolog: Koncepty (5 bodů)
Kód: Vybrat vše
vstup(V) :-
V = [
[barva-modra,motor-diesel, pocet_kol-6],
[motor-plyn,pocet_mist-40, barva-modra],
[motor-elektro,pocet_mist-5]
].
foldr(_, [], Acc, Acc) :- !.
foldr(Binary, [X | Xs], Acc, Y) :-
foldr(Binary, Xs, Acc, Z),
call(Binary, X, Z, Y).
foldl(_, [], Y, Y) :- !.
foldl(Binary, [X | Xs], Acc, Y) :-
call(Binary, X, Acc, NewAcc),
foldl(Binary, Xs, NewAcc, Y).
filter(_, [], []) :- !.
filter(Pred, [X | Xs], [X | Ys]) :-
call(Pred, X),
!,
filter(Pred, Xs, Ys).
filter(Pred, [_ | Xs], Ys) :- filter(Pred, Xs, Ys).
unique([],[]).
unique([X | Xs], [X | Ys]) :-
filter(notUnifiable(X), Xs, Z),
unique(Z, Ys).
notUnifiable(X, Y) :- X \= Y.
fst(H, Y) :- H=..[_, Y, _].
map(_, [], []) :- !.
map(Unary, [X | Xs], [Y | Ys]) :-
call(Unary, X, Y),
map(Unary, Xs, Ys).
koncept2nazvy(O, N) :- map(fst, O, N).
pridejNazvy(O, Acc, NewAcc) :-
koncept2nazvy(O, N),
append(Acc, N, NewAcc).
koncepty2nazvy(Os, Ns) :-
foldl(pridejNazvy, Os, [], Nd),
unique(Nd, Ns).
vyndej(Name, A-_, Acc, Acc) :- Name \= A, !.
vyndej(Name, Name-B, Acc, [B | Acc]).
getAttributeValue(O, Name, Value) :-
foldl(vyndej(Name),O,[], Values),
length(Values, L),
(L == 1 ->
Values = [Value] ;
(L == 0 ->
Value = nedef ;
%else
fail
)
).
p(Name, O, Acc, [Value|Acc]) :- getAttributeValue(O, Name, Value), !.
p(_, _, Acc, Acc).
getAttributeValues(Os, Name, Values) :- foldr(p(Name),Os, [], Values).
dvojce(Objekty, Nazev, Nazev-Hodnoty) :-
getAttributeValues(Objekty, Nazev, Vals),
unique(Vals, Hodnoty).
koncept(V, Y) :-
koncepty2nazvy(V, Ns),
map(dvojce(V),Ns,Y).
- Haskell: Kumulativní součty (5 bodů)
Kód: Vybrat vše
safehead :: [[a]] -> [a]
safehead xs | null xs = []
| otherwise = head xs
kumulace :: Num a => [[a]] -> [[a]]
kumulace m = reverse $ foldl (\km r -> kumulaceRadku (safehead km) r : km) [] m
kumulaceRadku :: Num a => [a] -> [a] -> [a]
kumulaceRadku [] r = scanl1 (+) r
kumulaceRadku kr r = foldr (\(a,b,c,d) acc -> a+b+c-d : acc) [] xs
where xs = zip4 kr r
zip4 :: Num a => [a] -> [a] -> [(a,a,a,a)]
zip4 kr r = zip4' kr r (0:kr) 0
where
zip4' :: Num a => [a] -> [a] -> [a] -> a -> [(a,a,a,a)]
zip4' _ [] _ _ = []
zip4' (a : kr) (b : r) (c : kr1) d = (b,d,a,c) : zip4' kr r kr1 (b+d+a-c)
- Haskell: Doplnění hypergrafu (5 bodů)
Kód: Vybrat vše
data Hypergraf a = Hypergraf [a] [[a]] deriving Show
testHypergraf = Hypergraf [1,2,3,4,5] [[1,3,5], [2,3,4]]
prvek :: Eq a => [a] -> [[a]] -> Bool
prvek _ [] = False
prvek x (y : ys) = jePrvek || jeObracenePrvek || prvek x ys
where
jePrvek = x == y
jeObracenePrvek = reverse x == y
difference :: Eq a => [[a]] -> [[a]] -> [[a]]
difference xs ys = foldr (\x a -> if prvek x a then a
else if not $ prvek x ys then (x : a)
else a
) [] xs
doplneni :: Eq a => Hypergraf a -> Hypergraf a
doplneni (Hypergraf xs ys) = Hypergraf xs (ys ++ hranyPridat)
where
vsechnyMozneHrany = kombinace 2 xs
hranyUvnitr = foldr (\hhrana ak -> ak ++ kombinace 2 hhrana) [] ys
hranyPridat = difference vsechnyMozneHrany hranyUvnitr
kombinace :: (Eq a, Integral b) => b -> [a] -> [[a]]
kombinace 0 _ = [[]]
kombinace _ [] = []
kombinace n (x : xs) | n > 0 = kombinace n xs ++ map (x:) (kombinace (n-1) xs)
Přidávám ještě moje řešení malých příkladů.
[list=1]
[*][b]Prolog: Generování výrokových formulí[/b] (5 bodů)
[code]
gen(1, Jmena, var(J)) :- !, member(J, Jmena).
gen(2, Jmena, not(P)) :- !, gen(1, Jmena, P).
gen(N, Jmena, V) :-
N > 2,
B is N-2,
C is N-1,
between(1,B,X),
D is C - X,
gen(X, Jmena, P),
gen(D, Jmena, F),
( V = and(F,P) ; V = or(F,P) ).
gen(N, Jmena, not(E)) :-
N > 2,
A is N-1,
gen(A, Jmena, E).
[/code]
[*][b]Prolog: Koncepty[/b] (5 bodů)
[code]
vstup(V) :-
V = [
[barva-modra,motor-diesel, pocet_kol-6],
[motor-plyn,pocet_mist-40, barva-modra],
[motor-elektro,pocet_mist-5]
].
foldr(_, [], Acc, Acc) :- !.
foldr(Binary, [X | Xs], Acc, Y) :-
foldr(Binary, Xs, Acc, Z),
call(Binary, X, Z, Y).
foldl(_, [], Y, Y) :- !.
foldl(Binary, [X | Xs], Acc, Y) :-
call(Binary, X, Acc, NewAcc),
foldl(Binary, Xs, NewAcc, Y).
filter(_, [], []) :- !.
filter(Pred, [X | Xs], [X | Ys]) :-
call(Pred, X),
!,
filter(Pred, Xs, Ys).
filter(Pred, [_ | Xs], Ys) :- filter(Pred, Xs, Ys).
unique([],[]).
unique([X | Xs], [X | Ys]) :-
filter(notUnifiable(X), Xs, Z),
unique(Z, Ys).
notUnifiable(X, Y) :- X \= Y.
fst(H, Y) :- H=..[_, Y, _].
map(_, [], []) :- !.
map(Unary, [X | Xs], [Y | Ys]) :-
call(Unary, X, Y),
map(Unary, Xs, Ys).
koncept2nazvy(O, N) :- map(fst, O, N).
pridejNazvy(O, Acc, NewAcc) :-
koncept2nazvy(O, N),
append(Acc, N, NewAcc).
koncepty2nazvy(Os, Ns) :-
foldl(pridejNazvy, Os, [], Nd),
unique(Nd, Ns).
vyndej(Name, A-_, Acc, Acc) :- Name \= A, !.
vyndej(Name, Name-B, Acc, [B | Acc]).
getAttributeValue(O, Name, Value) :-
foldl(vyndej(Name),O,[], Values),
length(Values, L),
(L == 1 ->
Values = [Value] ;
(L == 0 ->
Value = nedef ;
%else
fail
)
).
p(Name, O, Acc, [Value|Acc]) :- getAttributeValue(O, Name, Value), !.
p(_, _, Acc, Acc).
getAttributeValues(Os, Name, Values) :- foldr(p(Name),Os, [], Values).
dvojce(Objekty, Nazev, Nazev-Hodnoty) :-
getAttributeValues(Objekty, Nazev, Vals),
unique(Vals, Hodnoty).
koncept(V, Y) :-
koncepty2nazvy(V, Ns),
map(dvojce(V),Ns,Y).
[/code]
[*][b]Haskell: Kumulativní součty[/b] (5 bodů)
[code]
safehead :: [[a]] -> [a]
safehead xs | null xs = []
| otherwise = head xs
kumulace :: Num a => [[a]] -> [[a]]
kumulace m = reverse $ foldl (\km r -> kumulaceRadku (safehead km) r : km) [] m
kumulaceRadku :: Num a => [a] -> [a] -> [a]
kumulaceRadku [] r = scanl1 (+) r
kumulaceRadku kr r = foldr (\(a,b,c,d) acc -> a+b+c-d : acc) [] xs
where xs = zip4 kr r
zip4 :: Num a => [a] -> [a] -> [(a,a,a,a)]
zip4 kr r = zip4' kr r (0:kr) 0
where
zip4' :: Num a => [a] -> [a] -> [a] -> a -> [(a,a,a,a)]
zip4' _ [] _ _ = []
zip4' (a : kr) (b : r) (c : kr1) d = (b,d,a,c) : zip4' kr r kr1 (b+d+a-c)
[/code]
[*][b]Haskell: Doplnění hypergrafu[/b] (5 bodů)
[code]
data Hypergraf a = Hypergraf [a] [[a]] deriving Show
testHypergraf = Hypergraf [1,2,3,4,5] [[1,3,5], [2,3,4]]
prvek :: Eq a => [a] -> [[a]] -> Bool
prvek _ [] = False
prvek x (y : ys) = jePrvek || jeObracenePrvek || prvek x ys
where
jePrvek = x == y
jeObracenePrvek = reverse x == y
difference :: Eq a => [[a]] -> [[a]] -> [[a]]
difference xs ys = foldr (\x a -> if prvek x a then a
else if not $ prvek x ys then (x : a)
else a
) [] xs
doplneni :: Eq a => Hypergraf a -> Hypergraf a
doplneni (Hypergraf xs ys) = Hypergraf xs (ys ++ hranyPridat)
where
vsechnyMozneHrany = kombinace 2 xs
hranyUvnitr = foldr (\hhrana ak -> ak ++ kombinace 2 hhrana) [] ys
hranyPridat = difference vsechnyMozneHrany hranyUvnitr
kombinace :: (Eq a, Integral b) => b -> [a] -> [[a]]
kombinace 0 _ = [[]]
kombinace _ [] = []
kombinace n (x : xs) | n > 0 = kombinace n xs ++ map (x:) (kombinace (n-1) xs)
[/code][/list]