Wpis z mikrobloga

Próbuję napisać program w prologu, który będzie wyświetlał elementy listy w nowej linii z automatycznym liczeniem.

Ma wyglądać tak:

% pisz_numer([ala, kot, mama, pies]).
% 1. ala
% 2. kot
% 3. mama
% 4. pies

Napisałem takie coś:

pisz_numer([],0).
pisz_numer([Element|Ogon],Dlug) :- print(Dlug), print(Element), nl, pisz_numer(Ogon,X), Dlug is X+1.

Fajnie zlicza wszystko, ale przy wywołaniu:

pisznumer([ala, kot, auto, pies, kot],X).


Wyświetla mi jakieś dziwy:

91 ?- dlugosc([ala, kot, auto, pies, kot],X).
_G3917ala
_L170kot
_L185auto
_L200pies
_L215kot
X = 5

Ktoś może pomóc?

#programowanie
  • 24
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@GrabkaMan: Hmm, ale co to jest to dodaj(X,L,[X|L])? Biorąc pod uwagę, że L nie występuje nigdzie indziej, to taki napis jest raczej bez sensu.

Żeby odwrócić kolejność, możesz użyć akumulatora, lub odwrócić kolejność jawnie (napisać procedurę pomocniczą), lub użyć appenda.

Btw, odcięcie jest tu bardzo brzydkie, i oceniający prologowe programy zwykli urywać za to punkty. "Kanonicznym" rozwiązaniem jest dodanie Liczba > 0 do drugiej klauzuli lub użycie ifa.
  • Odpowiedz
@frax: Poprawka: appenda nie da się przyzwoicie użyć, bo albo będzie wolno (kwadratowa złożoność), albo będzie się idiotycznie pętlić. Z akumulatorem to wygląda tak:

wypisz(Liczba, L):- wypisz(Liczba, [], L).
wypisz(0, Acc, Acc).
wypisz(Liczba, Acc, L) :-
Liczba
  • Odpowiedz