prolog

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
% w ogonie listy.

% 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ę
%zapewnia pierwsza klauzula,

%która powoduje zatrzymanie wykonania predykatu,

%gdy pierwszy argument pasuje do głowy
%argumentu drugiego.

%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


Wyszukiwarka

Podobne podstrony:
Prolog Programowanie W F Clocksin C S Mellish
Przedmowa Prolog
prolog
Prolog Listy
Prolog
Prolog (3)
prolog
prolog, PROGRAMOWANIE DEKLARATYWNE, PROGRAMOWANIE DEKLARATYWNE, ZADANIA
1-2 lab, Laboratorium 1, Laboratorium 1 - Prolog
prologo
Broken Heart Od Prologu do Rozdziału 24
prolog zadania rozne
Prolog, Tłumaczenia, Trwające, Kailin Gow
prolog PZR6SZ3J3UV6LTM2KP7UMCZIPZGUR77BGTIBNTA
Czarna biblia 2.PROLOG
Prolog w 33 minuty
Prolog
Prolog
PD W2 Wstep do j Prolog(2010 11 05) 1 1

więcej podobnych podstron