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ściefindall + maplist.
forall/2
natomiast sprawdza akcję dla każdego wyniku osobno. W praktyce oznacza to, żeforall/2
zachowuje się jak pętla oparta ofail
.
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ć