[Prolog] Wypisywanie posortowanej bazy wiedzy

0

Ma ktoś jakiś pomysł jak wypisywać posortowaną (wg powierzchni lub ludności) bazę danych zapisaną w ten sposób?

miasto(nazwa(ogromniaste), wspolrzedne(4, 6), powierzchnia(4), ludnosc(5)).
miasto(nazwa(malostka), wspolrzedne(-3, -4), powierzchnia(1), ludnosc(2)).
miasto(nazwa(rozne), wspolrzedne(10, 10), powierzchnia(4), ludnosc(3)).
miasto(nazwa(graniczne), wspolrzedne(-5, 10), powierzchnia(4), ludnosc(1)).
miasto(nazwa(srodkowe), wspolrzedne(2, 1), powierzchnia(4), ludnosc(3)).
miasto(nazwa(duzaste), wspolrzedne(-7, 7), powierzchnia(5), ludnosc(5)).
miasto(nazwa(wietrzne), wspolrzedne(-10, -8), powierzchnia(4), ludnosc(5)).
miasto(nazwa(sredniaste), wspolrzedne(3, 5), powierzchnia(2), ludnosc(1)).
miasto(nazwa(dobre), wspolrzedne(0, 1), powierzchnia(4), ludnosc(2)).
miasto(nazwa(centralne), wspolrzedne(0, 0), powierzchnia(2), ludnosc(1)).

Póki co wypisuję to poleceniem

listing(miasto).
0

Dowiedziałem się, że w ten sposób można wszystko wypisać:

wypiszWszystkieMiasta :- miasto(Nazwa, Wspolrzedne, Powierzchnia, Ludnosc), write(Wspolrzedne), write('\t'), write(Powierzchnia), write('\t'), write(Ludnosc), write('\t'), write(Nazwa), nl, fail.

Tylko jak to posortować?

0

tak na szybko to...
ja bym dodał unikalny ID do kazdego rekordu.
Potem zrobic zbior wszystkich rozwiazan np findall, (albo memberem i do listy samemu zapisac) po liczbie ludnosci, liste par [ludnosc ,id]. Gdy posortujesz 'ludnosc', to wypisac wiersze wg ID.

0

Wielkie dzięki za pomoc. Z tymi informacjami już dałem sobie radę.

0

Z ciekawości (bo zastanawiam się nad zabraniem się do prologu - na razie z ciekawości looknąłem na podstawy i napisałem obowiązkowe HelloWorld i 99Beers) - mógłbyś wkleić tutaj gdzieś kod?

0

Jest to część większego programu, działa z wcześniejszą bazą wiedzy. 'Kryterium' jest, aby w miarę niepracochłonny dla mnie sposób sortować ze względu na powierzchnię, albo liczbę ludności.

podprogram(8) :-
	write('p - sortowanie wg powierzchni'), nl,
	write('l - sortowanie wg ludnosci'), nl,
	read(Kryterium),
	podprogram8(Kryterium).

podprogram8(p) :- podprogram81(p), !.
podprogram8(l) :- podprogram81(l), !.
podprogram8(_).

podprogram81(Kryterium) :-
	findall((Nazwa, Wspolrzedne, Powierzchnia, Ludnosc), miasto(Nazwa, Wspolrzedne, Powierzchnia, Ludnosc), Wszystkie),
	sortowanieBabelkowe(Wszystkie, Posortowane, Kryterium),
	wypiszListeMiast(Posortowane).

wypiszListeMiast([]).
wypiszListeMiast([(Nazwa, Wspolrzedne, Powierzchnia, Ludnosc) | O]) :-
	write(Wspolrzedne), write('\t'),
	write(Powierzchnia), write('\t'),
	write(Ludnosc), write('\t'),
	write(Nazwa), nl,
	wypiszListeMiast(O).

sortowanieBabelkowe(Lista, Posortowana, Kryterium) :-
	zamienMiejscami(Lista, Lista1, Kryterium), !,
	sortowanieBabelkowe(Lista1, Posortowana, Kryterium).
sortowanieBabelkowe(Posortowana, Posortowana, _).

zamienMiejscami([(Nazwa1, Wspolrzedne1, powierzchnia(P1), L1), (Nazwa2, Wspolrzedne2, powierzchnia(P2), L2) | O], 
		[(Nazwa2, Wspolrzedne2, powierzchnia(P2), L2), (Nazwa1, Wspolrzedne1, powierzchnia(P1), L1) | O], p) :-
		gt(P1, P2).
zamienMiejscami([(Nazwa1, Wspolrzedne1, P1, ludnosc(L1)), (Nazwa2, Wspolrzedne2, P2, ludnosc(L2)) | O], 
		[(Nazwa2, Wspolrzedne2, P2, ludnosc(L2)), (Nazwa1, Wspolrzedne1, P1, ludnosc(L1)) | O], l) :-
		gt(L1, L2).
zamienMiejscami([Z | O], [Z | O1], Kryterium) :- zamienMiejscami(O, O1, Kryterium).

gt(X, Y) :- X > Y.

Dodałem parę wcięć przy funkcjach zamienMiejscami, żeby lepiej to wyglądało, w razie problemów trzeba je usunąć.

0

prolog ciekawa rzecz, w ramach labek warcabki skodzilem ;-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1