🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.funkcyjne
4 messages
4 total messages Started by Zbyszek Malec Tue, 01 Nov 2005 20:55
[prolog] dlaczego źle?
#728
Author: Zbyszek Malec
Date: Tue, 01 Nov 2005 20:55
30 lines
1899 bytes
Hej
Mam taki przykład do samodzielnego zastanowienia się, dlaczego to jest 
źle. Przykład pochodzi z jakiegoś internetowego kursu i niestety nie ma 
tam podanej odpowiedzi. Ja wymyśliłem jedną, ale nie wiem czy jest 
prawidłowa. Być może ktoś mógłby napisać czy dobrze myślę.

<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>

Moim zdaniem chodzi o to, że próbując znaleźć związek korzystając z 
reguły next_year, interpreter będzie szedł w przyszłość, zamiast 
skorzystać z czegoś na kształt pattern matchingu.

Ps. Nie jestem pewien czy na dobrej grupie pytam. Jeśli nie, to jaka 
była by odpowiedniejsza?
Ps2. Sorki za ewentualne niedokonfigurowanie czytnika, być może coś 
przeoczyłem :]

-- 
Zbigniew Malec
Re: dlaczego źle?
#729
Author: Piotr Filip Mieszkowski
Date: Thu, 03 Nov 2005 11:45
17 lines
1826 bytes
Witam

Zbyszek Malec wrote:
> Moim zdaniem chodzi o to, że próbując znaleźć związek korzystając z
> reguły next_year, interpreter będzie szedł w przyszłość, zamiast
> skorzystać z czegoś na kształt pattern matchingu.

A nie chodzi przypadkiem o to, że wnioskowanie w next_year
zaczynałoby się od set_year a dopiero potem za pomocą get_year
próbowalibyśmy uzyskać całą datę używając date(Y,_,_) -- jakoś
mi to nie pachnie zbyt ładnie. Skąd brałyby się wartości w _?

W sumie Prolog-u uczyłem się już pewien czas temu i dość krótko,
więc wybacz(cie) jeśli to nie o to chodzi.

Pozdrawiam,
pfm
Re: [prolog] dlaczego źle?
#730
Author: 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/
Re: [prolog] dlaczego źle?
#731
Author: Adam Miauczynski
Date: Thu, 05 Jan 2006 10:03
42 lines
2436 bytes
To znowu ja. Wlasnie zauwazylem, ze nie zrozumialem do konca tego przykladu z poprzednimi i 
nastepnymi latami  (poprzedni i nastepny rok nie sa oczywiscie liczbami ale jakos zapisanymi datami 
ale tak to jest jak jezyk nie ma typow ;) ). Moja argumentacja z "typami" jest wiec do bani. 

Nalezy to raczej argumentowac w ten sposob, ze predykat get_year bedzie pobieral rok z daty, ktora 
jest nieukonkretniona zmienna a wtedy taki rok tez powinien byc nieukonkretniona zmienna i jako 
taki nie moze wystapic w wyrazniu arytmetycznym w predykacie is.

Nie wiem jak wygladaja predykaty get_year i set_year. Moze jakos tak:

<code>
get_year(data(_, _, Rok), Rok).
set_year(Rok, data(Dzien, Miesiac, _), data(Dzien, Miesiac, Rok)).
</code>

Przy powyzszych definicjach gdy zapytamy sie nastepujaco:

?- next_year(data(5, 1, 2006), X).

X = data(5, 1, 2007) 

to otrzymamy poprawna date od dzis za rok.

Ale gdy sprobujemy wyliczyc date od dzis w tyl o rok:

?- next_year(X, data(5, 1, 2006)).
ERROR: Arguments are not sufficiently instantiated
^  Exception: (8) _L326 is _G240+1 ?

to program "wysypie" sie na predykacie is, gdyz zmienna nieukonkretniona X wyraza 
nieukonkretniona date (dowolna) tak wiec i pobrany rok jest dowolny (nieukonkretniona zmienna 
_G240) a co za tym idzie nie da sie policzyc wartosci wyrazenia, w ktorym jeden ze skladnikow sumy 
jest nieukonkretniony.

Mam nadzieje, ze tym razem nie popelnilem za wielu bledow w argumentacji :)

Pozdrawiam,
Adam Miauczynski


-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads