Article View: pl.comp.lang.funkcyjne
Article #730Re: [prolog] dlaczego źle?
From: Adam Miauczynski
Date: Thu, 05 Jan 2006 09:21
Date: Thu, 05 Jan 2006 09:21
58 lines
2990 bytes
2990 bytes
> <code>
> next_year(Today,NextYear):-
> get_year(Today,Y), NY is Y+1, set_year(NY,Today,NextYear).
> prev_year(Today,PrevYear):-
> get_year(Today,Y), PY is Y-1, set_year(PY,Today,PrevYear).
>
> Note, that following definition of prev_year using next_year is not
> correct. Do you know why?
>
> prev_year(Today,PrevYear):-next_year(PrevYear,Today). %incorrect
>
> </code>
Zwroc uwage na "typy", ktorych na (nie)szczescie, nie ma w Prologu. Jesli term Today wyraza
dzisiejsza date a PrevYear rok bedacy liczba calkowita, to predykat prev_year odwoluje sie do
predykatu next_year z nieodpowiednimi "typami" (liczba na pozycji daty i data na pozycji liczby).
Ale ten przyklad jest dla mnie ciekawszy z innego powodu.
Rozpatrzmy nastepujacy fragment kodu w Prologu:
<code>
next(X, Y) :- Y is X+1.
prev(X, Y) :- Y is X-1.
</code>
Czy w powyzszym programie mozna zastapic definicje predykatu prev/2 nastepujaca klauzula:
<code>
prev(X, Y) :- next(Y, X).
</code>
Tu argumentacja z "typami" juz nie zadziala ale odpowiedz jest podobna: nie mozna tak zamieniac.
Otoz Prolog, do ktorego dodano arytmetyke przestal byc jezykiem programowania w logice (jesli
kiedykolwiek nim byl). Definicje, ktore korzystaja z predykatu is/2 nie moga juz wyrazac relacji a sa
pospolitymi, za przeproszeniem, funkcjami (wazne staje sie co jest dane a co szukane czyli istotny
staje sie przeplyw danych do/z predykatu).
Oto co sie stanie gdy bede chcial obliczyc liczbe poprzedzajaca 13:
?- next(X, 13).
ERROR: (user://1:13):
Arguments are not sufficiently instantiated
^ Exception: (8) 13 is _G180+1 ?
Nie oczekujmy, ze predykat 13 is X + 1 wyliczy nam, ze X powinno byc rowne 12 (to potrafi dopiero
predykat #= lub ?= w Prologach rozszerzonych o technologie wiezow). W standardzie Prologu
predykat is oczekuje po swojej prawej stronie wyrazenia arytmetycznego, w ktorym wszystkie
zmienne sa juz ukonkretnione i maja wartosci liczbowe.
Pozdrawiam i zycze powodzenia w zglebianiu jezyka Prolog!
AM
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Technical Details
Message-ID:
<dpioe4$d0g$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<dk8ko1$ccd$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: " Adam Miauczynski" <adam.miauczynski@gazeta.SKASUJ-TO.pl> Newsgroups: pl.comp.lang.funkcyjne Subject: Re: [prolog] dlaczego źle? Date: Thu, 5 Jan 2006 09:21:08 +0000 (UTC) Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 58 Message-ID: <dpioe4$d0g$1@inews.gazeta.pl> References: <dk8ko1$ccd$1@inews.gazeta.pl> NNTP-Posting-Host: tarnica.im.pwr.wroc.pl X-Trace: inews.gazeta.pl 1136452868 13328 172.20.26.234 (5 Jan 2006 09:21:08 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Thu, 5 Jan 2006 09:21:08 +0000 (UTC) X-User: adam.miauczynski X-Forwarded-For: 172.20.6.164 X-Remote-IP: tarnica.im.pwr.wroc.pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit