- Co to jest programowanie w logice?
- Co to jest predykat?
W jaki sposób możemy opisać fakt?
Przykład: facts.pl
(uruchamiamy pisząc swipl facts.pl
).
Jak zadawać pytania?
kot(X)
pies(X), teraz_glodny(X)
Różnica pomiędzy stałymi i zmiennymi.
Co to są predykaty wieloargumentowe?
Przykład: like.pl
Jakbyście zapytali o to, kogo lubi Jan? A o pary ludzi, którzy lubią się wzajemnie?
- Reguły wnioskowania
- Przykład:
rules.pl
Drzewo genealogiczne
- podajcie kilka faktów postaci
ojciec(siemomysl, mieszko1)
- utwórzcie predykat
wnuk
Oprócz orzekania o napisach (np. kot(pikus)
, czyli pikus
to obiekt, dla którego
zachodzi własność kot
), można orzekać o obiektach: trzymam_w_domu(kot(pikus, 10, 7))
.
Czytamy to: "kot(pikus, 10, 7)
to obiekt, dla którego zachodzi własność trzymam_w_domu
.
Napisz predykat co na podstawie imienia znajdzie ile zwierzę (z facts2.pl
) ma lat.
Napisz predykat co na podstawie imienia znajdzie zwierzęta mające (z facts2.pl
) ileś lat.
- Co to jest lista?
- Lista pusta kontra lista niepusta.
Możemy wprowadzać predykaty używające innych pomocniczych predykatów, często o wyższej arności.
Często używa się techniki „z akumulatorem”, czyli wprowadzamy pomocniczy argument, w którym akumulowany jest wynik.
- Napiszcie predykat
odwroc(Lista, Wynik)
który zachodzi, gdy listaWynik
jest odwróconą listąLista
. Uwaga: czy kolejność argumentów ma w tym przypadku znaczenie? Porównajodwroc([a,b,c], X)
orazodwroc(X, [a,b,c])
. filtruj(Lista, Element, Wynik)
- zachodzi, gdyWynik
zawiera tylkoElement
y - i to dokładnie tyle, co występuje wLista
.unikalne(Lista, Wynik)
- zachodzi, gdyWynik
zawiera wszystkie rodzaje elementów zLista
, ale bez powtórzeń. Kolejność występowania elementów wWynik
ma być zgodna z kolejnością pierwszych wystąpień elementów wLista
.
palindrom(A)
- zachodzi, gdy A jest palindromem. Jaka jest definicja palindromu?
polacz(A, B, C)
- zachodzi, gdy listaC
jest wynikiem konkatenacjiA
zB
, np.polacz([m,a], [c,h], [m,a,c,h])
.srodek(Lista, Wynik)
- zachodzi, gdyWynik
jest środkowym elementem/podlistą listyLista
. Umówmy się, że zachodzisrodek([a, b, c], b)
orazsrodek([a,b,c,d], [b,c])
.
Łatwo można sprawdzić, że zachodzi 2 = 2
. Natomiast 2 + 2 = 4
da nam false
. Dlaczego?
Do ewaluacji wyrażeń arytmetycznych używamy predykatu is/2
.
Z is W
odnosi sukces wtedy i tylko wtedy, gdy W
jest termem reprezentującym wyrażenie arytmetyczne, którego wszystkie składowe mają znaną wartość (liczbową) oraz Z
jest uzgadnialne z wartością tego wyrażenia (Z
może być stałą liczbową albo zmienną). Przykłady:
| ?- 2 is 1+1.
yes
| ?- X is 1+1.
X = 2 ? ;
no
(no
oznacza, że nie ma więcej rozwiązań niż X = 2
)
Istnieją także predykaty =:=/2
oraz =\=/2
.
+/2
, -/2
, */2
- standardowe
-/1
- negacja
//
- dzielenie całkowite, /
- dzielenie zmiennoprzecinkowe
mod
- modulo
nwd(A, B, C)
- zachodzi, gdy C jest największym wspólnym dzielnikiem A i B.wp(A, B)
- zachodzi, gdy A i B są względnie pierwsze.
W Prologu mamy dostęp do pewnego szczególnego typu negacji - służy do tego predykat \+
(o arności 1).
Wyrażenie \+ X
jest prawdziwe, gdy X
nie da się dowieść przy obecnej wiedzy.
pierwsza(X)
- zachodzi, gdy X jest liczbą pierwszą.