Prolog jest językiem deklaratywnym. Jego deklaratywność polega na tym, że programista deklaruje (wymienia) jedynie obiekty konieczne do rozwiązania problemu oraz związki, jakie pomiędzy tymi obiektami zachodzą, w postaci tzw. faktów oraz reguł. Zadanie do rozwiązania przedstawiane jest w postaci celu.
Polecenia języka PROLOG
abolish - usuwa definicje predykatu z bazy danych
abort - przerywa wykonanie programu
absolute_file_name - podaje ścieżkę dostępu do pliku
access_file - sprawdza prawa dostępu do pliku
append - powiązuje listy
apply - wywołuje goal z dodatkowymi argumentami
apropos - pokazuje pokrewne hasła z podanym jako argument hasłem
arg - dostęp do argumentu warunku
assert - dodaje klauzule do bazy danych
asserta - dodaje klauzule do bazy danych (pierwsza)
assertz - dodaje klauzule do bazy danych (ostatnia)
at_end_of_stream - sprawdza znak końca wprowadzonego łańcucha znaków
at_halt - rejestruje, że warunek pracuje w trybie at_halt
autoload - przeładowuje automatycznie wszystkie predykaty
bagof - znajduje wszystkie rozwiązania dla danej klauzuli
between - sprawdza zakres
call - uruchamia dana klauzule (mogą być podane pewne warunki)
call_dll_function - wywołuje funkcję korzystając biblioteki dynamicznej
call_with_depth_limit - bada zagnieżdżenie klauzuli
chdir - zmienia katalog roboczy
checklist - wskazuje na klauzule jako członka listy
clause_property - sprawdza właściwości klauzuli
close - zamyka łańcuch znakowy
close_dde_conversation - zamyka kanał dde
close_dll - zamyka połączenie z biblioteką dynamiczną
compound - sprawdza połączenia
consult - czyta (kompiluje) kod źródłowy
context_module - pobiera kontekst modułu bieżącej klauzuli
convert_time - konwertuje znacznik czasowy do stringa
copy_term - tworzy kopie warunku
current_flag - bada występujące flagi
current_foreign_library - bada uruchomione dzielone biblioteki (.so)
current_functor - bada występowanie nazw/parzystości
current_input - podaje bieżący łańcuch wejściowy
current_key - bada występowanie kluczy baz danych
current_module - bada istniejące moduły
current_op - bada bieżące deklaracje operatorów
current_output - podaje bieżący łańcuch wyjściowy
current_predicate - bada istniejące predykaty
current_stream - bada otwarte łańcuchy
current_thread - bada przesunięcia prologu
dde_current_connection - bada otwarte połączenia dde
dde_execute - wykonuje komende na serwerze dde
dde_register_service - rejestracje serwera dde
dde_request - tworzy zapytanie dde
dde_poke - uruchamia operacje na serwerze dde
dde_unregister_service - zawiesza serwis dde
debug - testowanie trybu debuggera
debugging - pokazuje status debuggera
default_module - przywraca pierwotne ustawienia
delete - usuwa wszystkie znaczniki z list
delete_file - usuwa pliki z systemu
dup_stream - tworzy kopie łańcuchów we/wy
dynamic - wskazuje definicje predykatu która mogła ulec zmianie
edit - edytuje plik
erase - usuwa rekord bazy danych
exists_file - sprawdza istnienie pliku
exit - wyjście z bloku instrukcji
expand_answer - rozszerza odpowiedź na zapytanie
expand_file_name - rozszerzenie nazwy pliku
expand_file_search_path - rozszerzenie ścieżki dostępu
expand_query - rozszerzenie zapytania
explain - tłumaczenie argumentu
export - eksportuje predykat poza moduł
export_list - lista publicznych predykatów w module
fail - zawsze fałsz
feature - podaje parametry konfiguracyjne systemu
file_base_name - podaje część ścieżki do pliku
file_name_extension - dodaje, usuwa lub testuje rozszerzenie pliku
file_search_path - definiuje alisasy lub lokalizuje pliki
fileerrors - ostrzega lub nie przed błędami w pliku
findall - znajduje wszystkie rozwiązania klauzuli
flag - prosta globalna zmienna systemowa
flatten - transformuje listę zagnieżdżoną do listy prostej
float - typ rzeczywisty
forall - dowodzi celu dla wszystkich rozwiązań lub innego celu
foreign_file - sprawdza załadowanie innych plików
format - formatuje wyjście
free_variables - znajduje nieograniczoną zmienna w warunku
garbage_collect - funkcja znajdująca niepotrzebne zmienne
get - czyta znak ze stringa
get0 - czyta następny znak ze stringa
get_single_char - odczytuje kolejny znak z teminala
get_time - pobiera bieżący czas
geten - sprawdza uruchomiony shell
halt - wyjście z prologu
hash_term Hash - wartość lub podstawowy warunek
help - pomoc
ignore - wywołanie argumentu ale zawsze zakończone sukcesem
import - importuje predykat z modułu
index - zmienia klauzule indeksowania
integer - typ całkowity
intersection - ustawia krzyżowanie
is - wykonuje wyrażenia arytmetyczne
is_absolute_file_name - zwraca wartość prawdy jeżeli argument jest prawidłową ścieżką dostępu do pliku
is_list - sprawdza czy typ jest typem listowym
is_set - sprawdza ustawiony typ
keysort - sortowanie z użyciem klucza
last - ostatni element listy
leash - zmienia porty które przegląda tracer
length - bada długość listy
library_directory - sprawdza katalog z bibliotekami prologu
limit_stack - sprawdza czy limit stosu nie został przekroczony
line_count - zlicza linie w łańcuchu znaków
line_position - bada położenie znaku w linii w łańcuchu znakowym
list_to_set - usuwa duplikaty
listing - dokonuje listowania programu do bieżącego modułu
load_files - ładuje kod źródłowy z opcjami
load_foreign - ładuje obcy moduł
load_foreign_library - ładuje obcą bibliotekę
make - sprawdza wszystkie zmiany dokonane w kodzie źródłowym
make_fat_filemap - tworzy plik zawierający nie FAT'owskie nazwy plików
make_library_index - tworzy automatycznie uruchamiany plik index.pl
maplist - transformuje wszystkie elementy do listy
member - sprawdza czy element jest członkiem listy
merge - łączy dwie posortowane listy
module - dokonuje deklaracji modułu
module_transparent - wskazuje moduł bazujący na meta predykacie
msort - sortuje ale nie usuwa duplikatów
multifile - wskazuje rozdzielone definicje lub predykaty
nl - wprowadza nową linię
nodebug - deaktywuje tryb debuggowania
nonvar - sprawdza ogranicznenia typów
nospy - usuwa spy-punkt
nospyall - usuwa wszystkie spy-punkty
not - negacja przez niepowodzenie
notrace - wyłącza śledzenie
number - sprawdza czy typ jest typem całkowitym czy rzeczywistym
numbervars - wylicza nieograniczone zmienne warunkowe używane w bazie
on_signal - "uchwyt" software'owego sygnału
once - wywołuje określenie celu
op - deklaruje operator
open - otwiera plik tworząc łańcuch
open_dde_conversation - uaktywnia kanał dde
open_null_stream - otwiera łańcuch zamykając wyjście
open_resource - otwiera programowo kopie zapasową łańcucha
open_shared_object - otwiera bibliotekę .so (unix)
peek_byte - czyta znak bez jego usuwania
plus - dodawanie
portray_clause - wypisuje (drukuje) warunek (klauzule)
predicate_property - podaje atrybuty zapytania
predsort - sortuje, używając predukatu określającego porządek
preprocessor - instaluje preprocesor przed kompilacją
print - drukuje warunek lub łańcuch
print_message - wypisuje wiadomość
profile - podaje statystyki wykonawcze
profiler - podaje lub zmienia status profiler'a
prolog_file_type - definiuje znaczenie rozszerzenia pliku
prolog_frame_attribute - podaje informacje o otoczeniu
prolog_load_context - informacje na temat kontekstu ?
prolog_skip_level - wskazuje najgłębsze poziom zagłębienia
prolog_to_os_filename - konwersja pomiędzy prologiem a plikami os
prolog_trace_interception - zatrzymuje tracera prologowego
protocol - tworzy log z działań użytkownika
protocola - dodaje log do pliku
put - pisze znak
qcompile - kompiluje źródło
qload - szybkie wgrywanie kodu źródłowego
read - czyta warunek
read_clause - czyta klauzule
read_link - czyta połączenie symboliczne
read_term - czyta warunek z opcjami
read_variables - czyta klauzule zawierającą zmienne
recorda - zapisuje rekord w bazie danych (pierwszy)
recorded - podaje rekordy zapisane w bazie
recordz - zapisuje rekord w bazie danych (ostatni)
redefine_system_predicate - usuwa definicje systemowe
rename_file - zmienia nazwy plików
require - sprawdza czy plik posiada wymagane opcje
reset_profiler - czyści statystykę podaną przez profiler'a
retract - usuwa klauzule z bazy danych
retractall - usuwa klauzule unifikacji z baz danych
reverse - odwraca ustawienie elementów listy
same_file - sprawdza czy argumenty nie odnoszą się do tych samych plików
see - zmienia bieżący łańcuch wejściowy
seeing - zapytanie o bieżący łańcuch wejściowy
seek - modyfikuje bieżącą pozycję w łańcuchu
seen - zamyka bieżący łańcuch wejściowy
select - wybiera element z listy
set_feature - ustawia cechy systemu
set_input - ustawia bieżący wejściowy łańcuch z łańcucha
set_output - ustawia bieżący wyjściowy łańcuch z łańcucha
set_tty - ustawia łańcuch 'tty'
setenv - ustawia shell otoczenia zmiennej
setof - znajduje wszystkie rzadkie rozwiązania
sformat - formatuje łańcuch znaków
shell - uruchamia podshell
show_profile - pokazuje wynik pracy profiler'a
size_file - pobiera rozmiar pliku
skip - opuszcza znak w bieżącym łańcuchu
sleep - wstrzymuje wykonania na określony czas
sort - sortuje elementy listy
source_file - bada jaki kod źródłowy jest właśnie uruchomiony
source_location - określa komórkę pamięci w której umieszczony został ostatni warunek
spy - ustawia spy-punkt
stack_parameter - pokazuje parametry stosu
statistics - pokazuje statystyki
stream_position - pobiera/szuka danej pozycji w pliku
string - sprawdza czy dany typ jest łańcuchem znakowym
string_length - określa długość łańcucha znakowego
string_to_list - konwersja pomiędzy typem łańcuchowym a listą
style_check - zmienia poziom ostrzeżeń o błędach
sublist - określa elementy które spełniają warunki
substring - pobiera część łańcucha znakowego
subtract - usuwa elementy nie spełniające warunków
swritef - sformatowany zapis łańcucha znakowego
tab - wyjściowa liczba przestrzeni w łańcuchu
tell - zmienia bieżące wyjście łańcucha
telling - zapytanie o bieżące wyjście łańcucha
term_expansion - konwersja warunków przed kompilacją
thread_create - tworzy nowe zadanie
thread_exit - zawiesza zadanie
thread_join - czeka na zakończenie zadania
throw - wywołuje obsługę wyjątków
time - określa czas potrzebny do wykonania celu
time_file - podaje czas ostatniej modyfikacji pliku
tmp_file - tworzy chwilowy plik
told - zamyka bieżące wyjście
trace - uruchamia tracera
tracing - zapytanie o stan w jakim jest tracer
trim_stacks - pokazuje niewykorzystane zasoby pamięci
true - prawda
tty_get_capability - pobiera parametry terminala
tty_goto - idzie do danej pozycji na ekranie
unknown - podaje niezdefiniowane predykaty
unload_foreign_library - odłącza biblioteki .so (unix)
unsetenv - usuwa shell otoczenia zmiennej
use_module - dołącza moduł
visible - pokazuje porty które są widziane przez tracer
wait_for_input - czaka na wejście
win_exec - powiela zadania
write - zapisuje warunek
write_ln - zapisuje warunek z nową linią
write_canonical - zapisuje warunek z zapytaniami, ignorując operatory
write_term - zapisuje warunek z opcjami
writef - sformatowany zapis
writeq - zapisuje warunek dodając zapytania
PRZYKŁADY PROGRAMÓW
Kod programu |
---|
Sposób uruchomienia |
%01 %podstawy lubi(jan,maria). %tu jest komentarz lubi(jan,ela). lubi(ela,jan). lubi(zbyszek,monika). lubi(jan,wino). lubi(jan,czekolada). lubi(maria,wino). lubi(ela,piwo). kobieta(maria). kobieta(ela). kobieta(ula). mezczyzna(jan). mezczyzna(zbyszek). mezczyzna(franek). rodzic(ula,maria). rodzic(jan,maria). rodzic(ula,zbyszek). %zbyszek=syn, wnuczek rodzic(jan,zbyszek). %jan=ojciec rodzic(franek,jan). %franek=dziadek rodzic(maria,ela). |
---|
Czy JAN lubi EWĘ? ?- lubi(jan,ewa). false. Co lubi JAN? ?- lubi(jan,X). X = maria ; X = ela ; X = wino ; X = czekolada. Kto lubi ELĘ? ?- lubi(X,ela). X = jan ; false. Czyim rodzicem jest JAN? ?- rodzic(jan,X). X = maria ; X = zbyszek. |
%02 %Dopisać poniższy kod: kogolubi(X,Y):- lubi(X,Y), kobieta(Y). |
Kogo lubi np. JAN? ?- kogolubi(jan,X). X = maria ; X = ela ; false. |
%03 %Dopisać poniższy kod: siostra(X,Y):- kobieta(X), rodzic(O,X), rodzic(O,Y). |
Czy Ula jest siostrą Jana? ?- siostra(ula,jan). false. Czy Maria jest siostrą Zbyszka? ?- siostra(maria,zbyszek). true Kto jest czyją siostrą? ?- siostra(X,Y). X = maria, Y = maria ; X = maria, Y = zbyszek ; X = maria, Y = maria ; X = maria, Y = zbyszek ; false. |
%04 %Dopisać poniższy kod: dziadek(X,Y):- rodzic(X,Z), rodzic(Z,Y), mezczyzna(X). |
?- dziadek(jan,maria). false. ?- dziadek(franek,maria). true Sprawdzić działanie programu wprowadzając imiona swojej rodziny. |
%05 %Dopisać poniższy kod: babcia(X,Y):- rodzic(X,Z), rodzic(Z,Y), kobieta(X). |
?- babcia(ula,maria). false. ?- babcia(ula,ela). true ?- babcia(X,Y). X = ula, Y = ela ; false. |
%06 %Dopisać poniższy kod: %potomek(A, B) jest prawdziwy, jeśli A jest potomkiem B. %Warunek bycia potomkiem możemy zapisać słownie następująco: %Jeżeli X jest rodzicem Y to Y jest potomkiem X %Jeżeli X jest rodzicem Z, a Y jest potomkiem Z to Y jest potomkiem X potomek(Y,X):− rodzic(X,Y). potomek(Y,X):− rodzic(X, Z), potomek(Y, Z ). |
?- potomek(ela,maria). true. ?- potomek(ela,ula). true ?- potomek(maria,ela). false. ?- potomek(X,Y). X = maria, Y = ula ; X = maria, Y = jan ; X = zbyszek, Y = ula ; X = zbyszek, Y = jan ; X = jan, Y = franek ; X = ela, Y = maria ; X = ela, Y = ula ; X = ela, Y = jan ; X = maria, Y = franek ; X = zbyszek, Y = franek ; X = ela, Y = franek ; false. |
%07 %LISTY % GŁOWA ... OGON %[a,b,c] a [b,c] %[[bury,kot],mruczy] [bury,kot] [mruczy] p([1,2,3,4,5]). p1([bury,kot,mruczy,[sobie,pod,nosem]]). |
Pokaż Głowę i/lub Ogon listy? ?- p([X|Y]). X = 1, Y = [2, 3, 4, 5]. ?- p1([_,_,_,[_|X]]). X = [pod, nosem]. |
%08 %arytmetyka %X=:=Y %X i Y są tą samą liczbą %X=\=Y %X i Y są różnymi liczbami %X<Y %X>Y %X=<Y %X>=Y wlada(a,100,120). wlada(b,120,130). wlada(c,130,150). wlada(d,150,155). ksiaze(X,Y):- wlada(X,A,B), Y>=A, Y=<B. |
?- ksiaze(X,110). X = a ; ?- ksiaze(X,120). X = a ; X = b ; ?- ksiaze(a,110). true. |
%09 %X+Y %X-Y %X*Y %X/Y %X//Y - całkowity iloraz %X mod Y - reszta z dzielenia %Z is X+Y - Z=X+Y lud(usa,203). lud(indie,548). lud(chiny,800). lud(brazylia,108). obszar(usa,3). obszar(indie,1). obszar(chiny,4). obszar(brazylia,3). gestosc(X,Y):- lud(X,P), obszar(X,A), Y is P/A. |
?- gestosc(chiny,X). X = 200. ?- gestosc(ch,X). false. ?- gestosc(X,200). X = chiny ; ?- gestosc(X,Y). X = usa, Y = 67.6667 ; X = indie, Y = 548 ; X = chiny, Y = 200 ; X = brazylia, Y = 36. |
%10 % poszukiwanie rejsu rejsy(lodz,warszawa,800,900). rejsy(lodz,krakow,930,1100). rejsy(warszawa,londyn,1100,1500). rejsy(warszawa,berlin,1130,1430). rejsy(krakow,rzym,830,1030). rejsy(krakow,praga,1300,1400). polaczenie(X,Y,O,P):- rejsy(X,Y,O,P). polaczenie(X,Y,O,P):- rejsy(X,Z,O,T1), polaczenie(Z,Y,T2,P), T2 >= T1+100. |
?- polaczenie(lodz,warszawa,X,Y). X = 800, Y = 900 ; ?- polaczenie(lodz,londyn,X,Y). X = 800, Y = 1500 ; ?- polaczenie(lodz,rzym,X,Y). false. ?- polaczenie(lodz,praga,X,Y). X = 930, Y = 1400 ; ?- polaczenie(X,Y,Z,P). X = lodz, Y = warszawa, Z = 800, P = 900 ; X = lodz, Y = krakow, Z = 930, P = 1100 ; X = warszawa, Y = londyn, Z = 1100, P = 1500 ; X = warszawa, Y = berlin, Z = 1130, P = 1430 ; X = krakow, Y = rzym, Z = 830, P = 1030 ; X = krakow, Y = praga, Z = 1300, P = 1400 ; X = lodz, Y = londyn, Z = 800, P = 1500 ; X = lodz, Y = berlin, Z = 800, P = 1430 ; X = lodz, Y = praga, Z = 930, P = 1400 ; false. |
%11 % Przeszukiwanie rekurencyjne stosujemy, gdy konieczne jest przeszukiwanie struktur Prologu % w celu znalezienia pewnych informacji lub kiedy struktury mogą mieć inne struktury jako argumenty. % np. lista koni: kon([kon1,kon2, kon3, kon4]). % % - chcemy dowiedzieć się czy dany koń % znajduje się na liście? % 1. najpierw sprawdzamy w Prologu czy dany koń % jest zapisany w głowie listy. % Jeśli TAK to mamy już odpowiedź. % Jeśli NIE sprawdzamy czy koń występuje % Oznacza to, że za każdym razem sprawdzamy % głowę "ogona" listy, % aż dojdziemy do listy pustej - wtedy nasze % poszukiwanie kończy się negatywnie. % 2. Piszemy predykat "member" aby cel % member(X,Y) był spełniony wtedy gdy X jest % termem należącym do listy Y. % (Predykat sprawdzający przynależność % elementu do listy) % 3. Musimy sprawdzić dwa warunki: % a) X jest elementem Y, jeśli X jest taki sam, % jak głowa Y. %X należy do listy jeśli jest jej głową: member(X,[X|_]). % lub member(X,[Y|_]):-X=Y. % b) X jest elementem listy, % jeśli należy do ogona tej listy (ogon=Y).: member(X,[_|Y]):-member(X,Y). %To jest cały predykat, dzięki któremu Prolog "wie" % jak ma szukać elementu na liście. % %Jeśli obiekt jest na liście, odpowiednią obsługę %która powoduje zatrzymanie wykonania predykatu, %gdy pierwszy argument pasuje do głowy %Drugi warunek dochodzi do głosu, jeśli drugi %argument predykatu member jest listą pustą. |
?- member(kon3,[kon1,kon2, kon3, kon4]). true |
%12 %silnia silnia(0,1). silnia(N,F):- N>0, N1 is N-1, silnia(N1,F1), F is N*F1. |
%13 % Wieża HANOI %http://pl.wikipedia.org/wiki/Wieże_Hanoi hanoi(1,A,B,C) :- write('Przenosze z '), write(A), write(' na '), write(B), nl. hanoi(N,A,B,C):- N>1, M is N-1, hanoi(M,A,C,B), hanoi(1,A,B,C), hanoi(M,C,B,A). |
?- hanoi(3, a, b, c). % 3 - ile mam klocków na tyczce "a" % klocki przekładamy na tyczkę "b" % tyczka "c" jest pomocnicza % WYNIK: % Przenosze z a na b % Przenosze z a na c % Przenosze z b na c % Przenosze z a na b % Przenosze z c na a % Przenosze z c na b % Przenosze z a na b |
%14 %Rycerze i Łotrzy %Wszyscy mieszkańcy pewnej wyspy są albo rycerzami %(ludźmi, którzy nigdy nie kłamią) albo %łotrami (ludźmi, którzy kłamią zawsze). %Spotykamy 3 wędrowców: %zadajemy pytanie osobie A: czy jest Łotrem czy Rycerzem? %- nie zrozumieliśmy odpowiedzi. %osoba B mówi, że osoba A powiedziała, że A jest Łotrem %osoba C mówi: nie wierz B bo to B jest Łotrem. %metaprogramowanie %PYTANIE; % kim jest B i C? rycerz(rycerz). lotr(lotr). powiedzial(rycerz,Zdanie):-call(Zdanie). powiedzial(lotr,Zdanie):- \+ Zdanie. |
?- powiedział(B, powiedział(A, lotr(A))), powiedział(C, lotr(B)). B=lotr C=rycerz |
%14 % ODWZOROWANIE %Program otrzymuje zdania i odpowiada na nie %zdaniami podobnymi, ale zmodyfikowanymi %SPRAWDŹ PLIK: odwzorowanie.doc podmien(czy,nie). podmien(ty,[ja,nie]). podmien(francusku,niemiecku). podmien(jestes,jestem). podmien(mowisz,mowie). podmien(X,X). /*przypadek ogólny*/ zmien([],[]). zmien([G|O],[X|Y]):-podmien(G,X),zmien(O,Y). |
?-zmien([ty,jestes,komputerem],Z). Z= [[ja, nie], jestem, komputerem] |
%15 % SUMOWANIE suma_do(1,1):-!. suma_do(N,Razem):- N1 is N - 1, suma_do(N1,Razem1), Razem is Razem1 + N. |
?- suma_do(5,X). X=15 |
%16 %Wypisanie kolejnych elementów listy pisz_termy([]). pisz_termy([X|Y]):- write(X),nl,pisz_termy(Y). |
?-pisz_termy([1,2,3]). %1 %2 %3 |
%17 %Ustalenie czy term przekazany jako pierwszy argument, %jest elementem listy przekazanej jako drugi argument elementListy(X,[X|_]). elementListy(X,[_|Y]):-elementListy(X,Y). |
?-elementListy(c,[a,b,c,d]). YES |
%18 % Wydobycie ostatniego elementu z listy last([X],X). last([_|L],Y):-last(L,Y). |
?-last([1,2,3,4,5],X). X=5 |
%19 %obliczanie pierwiastków równania kwadratowego % wersja I solve(A,B,C):- D is B*B-4*A*C, wynik(A,B,D), nl. wynik(_,_,D) :- D < 0, write('brak rozwiązania'), !. wynik(A,B,D) :- D =:= 0, X is -B/(2*A), write(['x=',X]), !. wynik(A,B,D) :- D > 0, X1 is (-B + sqrt(D))/(2*A), X2 is (-B – sqrt(D))/(2*A), write(['x1=', X1, 'and x2=', X2]). |
?- solve(1,2,1). [x=, -1] ?- solve(11,2,1). brak rozwiązania ?- solve(1,22,1). [x1=, -0.0455488, and x2=, -21.9545] |
%20 %obliczanie pierwiastków równania kwadratowego % wersja II solve(A,B,C):- D is B*B-4*A*C, wynik(A,B,D), nl. wynik(_,_,D) :- D < 0, write('brak rozwiązania'), !. wynik(A,B,D) :- D =:= 0, X is -B/(2*A), write(['x=',X]), !. wynik(A,B,D) :- D > 0, pierw(D,D,SqrtD), X1 is (-B + SqrtD)/(2*A), X2 is (-B - SqrtD)/(2*A), write(['x1=', X1, 'and x2=', X2]). % SqrtD - liczymy iteracyjnie formułą: % N1 = N – (N^2-X)/(2*N) % np: sqrt(8)= 1, 4.5, 3.148888884, 2.843780728, % 2.828468572, 2.828427125, ... % lub wbudowanym poleceniem sqrt(D). pierw(X,N,Pierw) :- N1 is N-(N*N-X)/(2*N), not(dokladnosc(N1, N)), write(['N1=', N1, 'N=', N, 'X=', X]), nl, pierw(X, N1, Pierw). pierw(_,N,N):-write(N). dokladnosc(X,Y) :- X/Y > 0.99999, X/Y < 1.00001. |
?- solve(1,2,1). [x=, -1] ?- solve(11,2,1). brak rozwiązania ?- solve(1,22,1). [x1=, -0.0455488, and x2=, -21.9545] |
%21 %Liczenie elementów listy dl([],0). dl([_|O],N) :- dlugosc(O,X), N is X+1. |
?- dl([1,2,3,4,3,2],X). X = 6. ?- dl([],X). X = 0. |
%22 %dodaj na początku nowy element listy dodaj(X,L,[X|L]). |
?- dodaj(2,3,X). X = [2|3]. ?- dodaj(2,[3,4,5,6],X). X = [2, 3, 4, 5, 6]. ?- dodaj(a,[c,d],X). X = [a, c, d]. ?- dodaj([a,b],[c,d],X). X = [[a, b], c, d]. |
%23 %Usuwanie pojedynczych elementów z listy usun(X,[X|Reszta],Reszta). usun(X,[Y|Ogon],[Y|Reszta]) :- usun(X,Ogon,Reszta). |
?- usun(2,[1,2,3,4],X). X = [1, 3, 4] ; ?- usun(a,[a,b,a,c,a,a],X). X = [b, a, c, a, a] ; X = [a, b, c, a, a] ; X = [a, b, a, c, a] ; X = [a, b, a, c, a] ; false. ?- usun(a,[a,b,c,d],X). X = [b, c, d] ; false. ?- usun(c,[a,b,c,d],X). X = [a, b, d] ; false. ?- usun(c,X,[a,b,c,d]). X = [c, a, b, c, d] ; X = [a, c, b, c, d] ; X = [a, b, c, c, d] ; X = [a, b, c, c, d] ; X = [a, b, c, d, c] ; false. ?- usun(1,X,[a,b,c,d]). X = [1, a, b, c, d] ; X = [a, 1, b, c, d] ; X = [a, b, 1, c, d] ; X = [a, b, c, 1, d] ; X = [a, b, c, d, 1] ; false. |
%24 %dopisać do przykładu 23 predykat: wstaw(X,L,D) :- usun(X,D,L). |
?- wstaw(a,[a,b,a,c,a,a],X). X = [a, a, b, a, c, a, a] ; X = [a, a, b, a, c, a, a] ; X = [a, b, a, a, c, a, a] ; X = [a, b, a, a, c, a, a] ; X = [a, b, a, c, a, a, a] ; X = [a, b, a, c, a, a, a] ; X = [a, b, a, c, a, a, a] ; false. ?- wstaw(2,[1,2,3,4],X). X = [2, 1, 2, 3, 4] ; X = [1, 2, 2, 3, 4] ; X = [1, 2, 2, 3, 4] ; X = [1, 2, 3, 2, 4] ; X = [1, 2, 3, 4, 2] ; false. |
%25 %dopisać do przykładu 23 predykat: nalezy(X,L) :- usun(X,L,_). |
?- nalezy(a,[a,b,a,c,a,a]). true ?- nalezy(2,[1,2,3,4]). true ?- nalezy(22,[1,2,3,4]). false. |
%26 %oblicz sume kwadratow roznic dwoch list %(dlugosci takie same). rk([], [], 0). rk([Xg|Xo], [Yg|Yo], N) :- rk(Xo, Yo, N1), N is N1 + (Xg-Yg)*(Xg-Yg). |
?- rk([3,2,1],[1,2,3],X). X = 8. |
Linki do stron:
http://www.swi-prolog.org/download/stable - stabilne wersje instalacyjne