Thread View: pl.comp.lang.funkcyjne
4 messages
4 total messages
Started by Zbyszek Malec
Tue, 01 Nov 2005 20:55
[prolog] dlaczego źle?
Author: Zbyszek Malec
Date: Tue, 01 Nov 2005 20:55
Date: Tue, 01 Nov 2005 20:55
30 lines
1899 bytes
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?
Author: Piotr Filip Mieszkowski
Date: Thu, 03 Nov 2005 11:45
Date: Thu, 03 Nov 2005 11:45
17 lines
1826 bytes
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?
Author: 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/
Re: [prolog] dlaczego źle?
Author: Adam Miauczynski
Date: Thu, 05 Jan 2006 10:03
Date: Thu, 05 Jan 2006 10:03
42 lines
2436 bytes
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