Scheme vs. Prolog

10. 1. 2008 16:43 (aktualizováno) pita601

ÚVOD:

Jazyk Scheme je funkcionální deklarativní jakyk vycházející z jazyka Lisp. Jeho standart byl stanoven v roce 1978, jeho tvůrci byli pánové G. Sussman a G. Steele.

UPLATNĚNÍ V PRAXI

Každý si jistě řekne, k čemu takový jazyk je. A pro podobné rýpaly mám částečný výčet konkrétních příkladů nasazení Scheme v praxi :

  • Na mnoha školách po celém světě pomáhá studentům osvojit si deklarativní přístup k programování. Je totiž údajně jeden z nejsnažších jazyků z této kategorie
  • Jsou v něm napsány nekteré pluginy pro GNU grafický nástroj GIMP Odkaz
  • Původně byl vytvořen jako prostředek pro implementaci Actor modelu

Pro porovnání uvádím odkaz na Prolog Development Center, kde se nacházejí programy psané v Prologu, jiné uplatnění Prologu v praxi jsem nenašel.

ROZDÍLY OPROTI OSTATNÍM JAZYKŮM

Scheme má od každého paradigmata kousek. Přejatou z Imperativního (procedurální – Pascal,C) má možnost vytvářet funkce, a také byl pro zjednodušení přejat IF, který alespoň mě v Prologu velmi chyběl, ovšem už nebyly přejaty infixové operátory tzn. příklad 5+5 se ve Scheme dá napsat jednině (+ 5 5). Ovšem největším překvapením je prvek se kterým jsem se ještě jinde nesetkal, dalo by se to vyjádřit tvrzením Všechno je vším.

  • Vytváření funkcí
                   %Prolog: funkce jako taková neexistuje, ale je možné ji simulovat
%definici pravidla
vypis() :- write('Ahoj vita te program Example').
secti(X,Y,Result) :- Result is X + Y.

;;;Scheme: funkce existuje a dokonce je sintaxí trochu podobná
;;;funkci definované v nějakém procedurálním jazyce
(define proc ;definujeme funkci s nazvem proc
(lambda(a b) ;urcime ze bude mit 2 parametry a a b
(+ (* a a) (* b b)) ;telo funkce a zaroven return
)
)
  • Přejaty IF
                   %Prolog: if neexistuje, řeší se různě pomocí operatorů porovnání
%v kombinaci s řezy
%příklad: pokud je císlo větší než 50 vrat no, pokud ne
% vrat to cislo na druhou
naDruhou(X,Result) :- X>50,!,fail.
naDruhou(X,Result) :- Result is X * X.

;;;Scheme: if existuje tak jak ho známe, jen podmínka díky
;;;neexistenci infix. opratoru vypada netipicky
(define nadruhou
(lambda(a)
(if(> a 50)
#f
(* a a)
)
)
)
  • Všechno je vším
                  ;;;Scheme: operator=funkce=parametr z pohledu sintaxe jsou si 
;;;všechny tito věci rovny
(nadruhou 40) ;volani funkce s parametrem 40
(* 1 5 2) ;nasobeni cisel 1*5*2 ... vysledkem bude 10
(* 1 (nadruhou 5) 2) ;50

Predikát ve Scheme má také velmi odlišnou syntaxi od Prologu. Je to vlastně běžná funkce, která má návratové hodnoty #t nebo #f a pri volání se uvádí s ? (otazníkem) – viz. přiklad

               ;Scheme: porovnání 2 prvků
(define equal
(lambda(a b)
(if(= a b)
#t
#f
)
)
)

(equal? 4 6)
---------------------
%Prolog: pro srovnání
equal(X,X) :- !.
equal(X,Y) :- !,fail.

?- equal(4,5).

Dalším prvkem, kterým se Scheme blíží spíše imperativním jazykům je cyklus. Prolog jej nemá, nahrazuje se rekurzí.

        ;Scheme:
(do
((x 1 (+ x 1)))
((> x 10) (newline))
(display x)
(display " ")
)

Scheme také nabízí možnost přiřazení.

        ;Scheme:
(set! p 10)
%Prolog:
(p is 10)

Vrcholem přibližování se Scheme k procedurálním jazykům je blok begin, ten totiž způsobí, že kód do něj uzavřený se bude chovat čistě procedurálne).
V Prologu samozřejmě nemá obdobu.

           (begin
(set! x 5)
(* x 5)
)

ZÁVĚREM

Sám sem při tvorbě tohoto článku byl překvapen jak až rozdílné mohou být jazyky partřící do stejné skupiny deklarativních jazyků.

Scheme má mnoho imperativních prvků aď už podmínky (if) tak cykly nebo blok begin, proto je možná považován za dobrý výukový jazyk pro logické programování, a také dobrý na přechod z procedurálního programování. Podle mého názoru pokud začátečník ve Scheme nebude mít dostatečný teoretický základ o deklarativním způsobu a nebude se snažit tak psát, tak bude jen jazyk zneužívat z čehož nebude mít žádný užitek.

Prolog se optori tomu drží striktně deklarativního způsobu a imperativní prvky až na vyjímky nepodporuje, proto začít s ním je mnohem těžší a dokud výborně nepochopíte principy deklarativního programování nenapíšete nic, což možná mnoho lidí odradí, ale ty kteří se nedají budou obohaceni o tuto cennou zkušenost.

Můj závěr tedy je takový, Scheme je dobré pro lidi kteří vědí co chtějí. Ale naučit se deklarativnímu uvažování je jako naučit se plavat, musí Vás hodit do vody, sice se budete chvilku topit, ale pak se z Vás možná stanou dobrí plavci a to splňuje Prolog lépe.

ZDROJE

http://www.htus.org/Book/2001–11–13/howto-Z-H-3.html

http://reboot.cz/howto/pro­gramovani/uvod-do-scheme-3-cast/articles.html?id=31

http://www.schemers.org/

Specifikace R5RS

http://atd.havrlant.net/scheme-aneb-programujeme-funkcionalne

http://www.root.cz/clanky/scheme-kostlivec-ve-skrini-nebo-nehasnouci-hvezda/

Česká Wikipedia

Anglická Wikipedia

Sdílet