Skip to content

Instantly share code, notes, and snippets.

@jiribenes
Last active March 4, 2021 09:45
Show Gist options
  • Save jiribenes/62aa379695fd5177cf612e411f289c53 to your computer and use it in GitHub Desktop.
Save jiribenes/62aa379695fd5177cf612e411f289c53 to your computer and use it in GitHub Desktop.
Cvičení z Neprocedurálního programování - 1 - Prolog jako databáze faktů
% :- se čte jako "if"/"pokud"
% . se čte jako "konec"
% , se čte jako "and"
% ; se čte jako "nebo"
% Soubor zkonzultujete ve swiplu pomocí příkazu `consult('soubor.pl').`
%%% Zadání:
% Chceme vytvořit systém práv pro kanceláře
% Administrátoři
admin(jirka).
admin(petr).
% Účetní oddělení
uctar(ferda).
uctar(ferda2).
% Ferda dělá fakt dobrý kafe!
dela_dobre_kafe(ferda).
% `smi_do_mistnosti` odpoví true, pokud daná Osoba smí do dané Místnost-i
% Admini smí kamkoliv
smi_do_mistnosti(Osoba, Mistnost) :- admin(Osoba).
% Účtaři smí do účtárny
smi_do_mistnosti(Osoba, uctarna) :- uctar(Osoba).
% Následující řádka se čte spíš jako
% smi_do_mistnosti(Osoba, jidelna) if uctar(Osoba) and dela_dobre_kafe(Osoba)
smi_do_mistnosti(Osoba, jidelna_vedle_uctarny) :- uctar(Osoba), dela_dobre_kafe(Osoba).
% Všichni smí na záchod a do únikového východu
smi_do_mistnosti(Osoba, zachod).
smi_do_mistnosti(Osoba, unikovy_vychod).
% grafy
%
% A ------> B ---> C
% \ \ /|
% \| \| /
% E----------->F
% \ /|
% \| /
% D /
% /| /
% / /
% G ---> H
%
% Cesty z A do C:
%
% A, B, C
% A, B, F, C
% A, E, F, C
edge(a, b).
edge(a, e).
edge(b, c).
edge(b, f).
%edge(c, a). % Tahle hrana vytvoří cyklus
edge(e, d).
edge(e, f).
edge(f, c).
edge(g, d).
edge(g, h).
edge(h, f).
% Chceme definovat 'path(U, V)', který značí jestli existuje orientovaná cesta z U do V
% Hranu z U do V značím jako U -> V
% Orientovanou cestu z U do V značím jako U ~~~> V
% U -> V
path(U, V) :- edge(U, V).
% U -> W = Z ~~~> V
path(U, V) :- edge(U, W), path(W, V).
%%%%% Zadání
% Logická formule
%
% a(X, Y) ... (X /\ Y)
% nebo(X, Y) ... (X \/ Y)
% ne(X) ... ~X
%
%
% pla ... T
% nepla ... F
% Zavolejte `priklad(Z)` ve swipl-u
% a Prolog vam vypise pravdivost formulky
priklad(Z) :-
Formulka = a(pla, ne(nebo(nepla, pla))), % T /\ ~(F \/ T)
vyhodnot(Formulka, Z).
vyhodnot(pla, pla).
vyhodnot(nepla, nepla).
vyhodnot(ne(X), nepla) :- vyhodnot(X, pla).
vyhodnot(ne(X), pla) :- vyhodnot(X, nepla).
vyhodnot(a(X, Y), Z) :-
vyhodnot(X, HX),
vyhodnot(Y, HY),
( (HX=pla, HY=pla, Z=pla) % (T /\ T) = T
; (HX=nepla, Z=nepla) % (F /\ _) = F
; (HY=nepla, Z=nepla) % (_ /\ F) = F
).
vyhodnot(nebo(X, Y), Z) :-
vyhodnot(X, HX),
vyhodnot(Y, HY),
( (HX=pla, Z=pla) % (T \/ _) = T
; (HY=pla, Z=pla) % (_ \/ T) = T
; (HX=nepla, HY=nepla, Z=nepla) % (F \/ F) = F
).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment