Skip to content

Instantly share code, notes, and snippets.

@JankDev
Last active January 13, 2020 15:39
Show Gist options
  • Save JankDev/b0c0478365cf5ee906db2562b51b255f to your computer and use it in GitHub Desktop.
Save JankDev/b0c0478365cf5ee906db2562b51b255f to your computer and use it in GitHub Desktop.
Streszczenie najważniejszych rzeczy do prologa.

Szybka powtórka do PROloga

W funkcji foldl/4 (reducer,list,initialValue,result) pierwszy argument, czyli funkcja redukująca, za pierwszy argument
bierze pierwszą wartość listy dopiero POTEM drugi argument jest akumulatorem.
Czyli jak pierwszy element listy wchodzi do funkcji redukującej to DRUGI argument jest wartością początkową,
a PIERWSZY jest pierwszym elementem listy.

Funkcja nth1/4 (index,listToInsert,element,restOfList) wybiera/dodaje element na index pozycji.

Funkcja maplist(mapper,list,result) zwraca nową listę, gdzie każdy element został przekształcony zgodnie z mapper'em

Funkcja bagof\setof/3 (fieldToBeInTheList, query, list) działą podobnie jak GROUP BY w SQL,
jeśli pominiemy argumenty, których nie chcemy by używał do porównania(za pomocą (Arg1,Arg2)^pred(Arg1,..Arg2,..)) czy 2 wyniki są takie same to pogrópuje tylko po pozostałych.

Funkcja findall/3 (fieldInList, (query, ?predicate),list) znajduje wszystkie wyniki co spełniają query z warunkiem opcjonalnym predicate.

Funkcja format('~w',arg) pamiętać o pojedynczym cudzysłowie.

Funkcja foreach/2 (query,function) robi coś dla każdego zapytanie/listy.

Różnica między foreach i forall

  • foreach/2 tworzy wielkie zapytanie składające się z koniunkcji wszystkich akcji. W praktyce można powiedzieć, że działa to tak jak podejście findall + maplist.
  • forall/2 natomiast sprawdza akcję dla każdego wyniku osobno. W praktyce oznacza to, że forall/2 zachowuje się jak pętla oparta o fail.

Funkcja reverse/2 (list,reverseList) odwraca listę

Funkcja include/3 (predicate,list,filteredList) zwraca listę elementów które spełniają predicate

Funkcja append/2 (listOfLists, concatenationOfLists) łączy listy zawarte w listOfLists w jedną; zwraca true jeśli concatenationOfLists jest zlączęniem list w listOfLists

Jeśli tworzymy listę za pomocą funkcji length/2 (list,size) to jeśli wykorzystamy ją w funkcji append/3,
żeby wiedzieć co dodać, aby otrzymać jakąś inną listę to append/3 zwróci listę, która posiada elementy z tej wynikowej
minus ilość elementów w tej liście z length/2, np:
odetnij_z_lewej(Number,List,Result) :- length(E,Number), append(E,Result,List). i:
odetnij_z_lewej(3,[1,2,3,4],X) zwróci X=[4]

Funkcja member/2 (element, list) sprawdza czy element jest w liście

Funkcja call/1 (function/predicate) wywołuje funkcję/predykat

Funkcja call/2+ (function, extraArg1,extraArg2,...) wywołuje funkcję function z dodatkowymi argumentami. Wygodniejsze do korzystania zamiast ../2

Operator ! oznacza, że prolog nie będzie wykonywał alternatywnych poszukiwań.Zakończy na tej 'gałęzi', na której jest

Pamiętaj, że operator ../2 w przypadku Function =.. List dodaje też nazwę funkcji do listy.

:- dynamic predicate/N oznacza, że dany predykat będzie modyfikowany w trakcie programu

assert/1 (predicate) Zapisuje fakt do bazy wiedzy, predicate musi być dynamic

retract/1 (term) zwraca i jednocześnie usuwa fakt z bazy wiedzy

:- use_module(library(assoc)) dodaje moduł ze wsparciem dla słowników do programu.

del_min_assoc/4 (assoc,key,value,smallerAssoc) zwraca słownik z usuniętym najmniejszym kluczem.

put_assoc/4 (key,assoc,value,smallerAssoc) zwraca słownik z dodanym elementem

gen_assoc/3 (key,assoc,value) zwraca klucze i wartości w słowniku

min_assoc/3 (assoc,key,value) zwraca klucz i wartość o najmniejszym kluczu

empty_assoc/1 (assoc) zwraca pusty słownik

list_to_assoc/1 (list,assoc) zamienia listę postaci [K-V,K-V] na słownik

assoc_to_list/2 (assoc,list) zamienia słownik na listę

flatten/2 (listOfLists, flattenedList) spłaszcza listę list; jeśli list jest więcej niż 1 to po prostu robi appenda

:- op/3 (precedence,type,name) tworzy operator o ważności precedence, typie type, i nazwie name.
Typy:
xf lub fx operator jednoargumentowy x musi wiązać mocniej niż y, inaczej operatora nie można zagnieżdzać
yf lub fy operator jednoargumentowym, y musi wiązać tak samo albo mocniej; można zagnieżdżać
xfy lub yfx operator dwuargumentowy; ustawiamy, gdzie chcemy zagnieżdżać

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment