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
Wiesz może jak zadeklarować tylko raz zmienną?


@GrabkaMan: W prologu nie ma zmiennych!

Po prostu zdefiniuj

pisznumer(Lista) :- pisznumer(Lista).

Termy o różnej liczbie argumentów są różnymi termami, dlatego nazwy tradycyjnie zawsze podaje się z arnością, np. pisz_numer/1, pisz_numer/2.

EDIT: ktoś się może przyczepić, że nazwy "zmienna" się używa, ale to nie są prawdziwe zmienne w rozumieniu normalnych języków imperatywnych.
@frax: Ja nie wiem, nie ogarniam. Słaby jestem z programowania, dlatego szukam pomocy. :<

Możesz zobaczyć, dlaczego to wywołanie powoduje błąd:

Generalnie chodzi o to, że podaję numer 155 i program ma wypisać:
one five five.

% wypisz([]).
wypisz(Liczba, X):- Liczba1 is Liczba mod 10, cyfry(Liczba1,X), Liczba2 is (Liczba // 10), wypisz(Liczba2,_).

Przykładowa cyfra:
cyfry(1,one).

Nic się nie dzieje i muszę abortować. :/
No i jeszcze cały czas przy konsultowaniu dostaję:

71 ?- consult('C:/Users/GrabkaMan/Desktop/ZadDom.pl').

Correct to: "consult('C:/Users/GrabkaMan/Desktop/ZadDom.pl')"?
@GrabkaMan: Definiujesz 2 termy: wypisz/1 i wypisz/2 - nic dziwnego, że wypisz/2 się pętli, skoro nie ma klauzuli kończącej. Zamień wypisz([]). na wypisz([], _). i powinno się zacząć kończyć.

Przy czym ten argument X nie wygląda na sensownie używany. Nie wiem, co właściwie ta funkcja ma robić, w drugi argument wstawić listę termów reprezentujących cyfry? Czy wypisać coś na ekran? W tej chwili będzie tam lądować term odpowiadający ostatniej cyfrze.
@frax: Takie coś na razie mam:

wypisz(0) :- !.

wypisz(Liczba):- Liczba1 is Liczba mod 10, cyfry(Liczba1,X), dodaj(X,L,[X|L]) ,Liczba2 is (Liczba // 10), wypisz(Liczba2).


Jak dam zamiast tego dodaj print(X) to działa fajnie. Ale potrzebuję w drugą stronę wypisywać. :/