🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.funkcyjne
Article #730

Re: [prolog] dlaczego źle?

#730
From: Adam Miauczynski
Date: Thu, 05 Jan 2006 09:21
58 lines
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-mail
References: <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