Skocz do zawartości
Forum komputerowe PC Centre
Łełas

[Prolog] Kilka zadań

Rekomendowane odpowiedzi

Witam serdecznie.

Właśnie zaczynam swoją przygodę z prologiem, co prawda nieco wymuszoną przez uczelnię ale nvm.

Rozwiązując zadania napotkałem na kilka problemów.

 

Zadanie 1.

Znaleźć najczęściej powtarzający się element i go wypisać.

Przykład:

maxlist([a,b,a,a,b,a,d,a,c],X).
X=a.

Sądzę, że najpierw trzeba posortować listę wejściową, ale chyba typu char się nie da, więc należy za pomocą name zamienić litery na liczby, posortować, zamienić ponownie na litery. W ten sposób z listy wejściowej otrzymujemy L=[a,a,a,a,a,b,b,c,d]. Teraz w jakiś sposób należy obliczyć ilość wystąpień danego elementu i znaleźć element najczęściej występujący i go wypisać. Niestety nie wiem jak to zrobić, nie wiem nawet czy sortowanie jest konieczne. Dlatego proszę o pomoc.

 

Zadanie 2.

Znaleźć największy przedział na liście przedziałów, podzielić go na pół, modyfikując w ten sposób listę wejściową. Zakładamy, że pierwsza współrzędna jest zawsze mniejsza od drugiej.

Przykład:

cord([[-4,2],[-2,14],[-1,11]], X).
X = [[-4,2],[-2,8],[8,14],[-1,11]],X).

Jak widać największy przedział to [-2,14], jest on więc dzielony na pół i otrzymujemy z niego 2 przedziały: [-2,8] i [8,14].

Tego zadania nawet nie potrafię ruszyć. Nie wiem co należy robić.

 

Zadanie 3.

Z listy słów należy utworzyć podlisty zawierające litery pierwszych i ostatnich liter danego wyrazu.

Przykład:

polacz([pies,kot,krowa],X).
X = [[p,s],[k,t],[k,a].

Edit: To już zrobiłem oto kod (może się komuś przyda):

odwroc([X],[X]).
odwroc[H|T],X) :- odwroc(T,Y), append(Y,[H],X).

polacz([H|T], [G|O]) :- name(H,L1), L1=[H1|T1], name(P,[H1]), odwroc(L1,L2), L2=[H2|T2], name(L,[H2]), G=[P,L], polacz(T,O).

Edytowane przez Nerio

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

akurat prolog jest mi obcy, ale np. 1 zadanie do trudnych nie należy. Sortować nie ma po co... Wystarczy zwykły licznik wystąpień (w tym wypadku liter jest 4 i trzeba dla każdej z nich zrobić licznik, dla całego alfabetu odpowiednio więcej...). Jak już będziesz miał tablicę wystąpień, czy inną wymyśloną strukturę danych to porównujesz po kolei kolejne liczniki. Największy np. przepisujesz do W_MAX i np. do W_MAX_litera jaka dokładnie litera wystąpiła.

 

P.S. Kod chyba będzie krótszy, jak się zrobi owe sortowanie. Wtedy wystarczy jeden licznik W_MAX (czy raczej znacznik), który będzie przechowywać największą liczbę wystąpień, a w innej zmiennej zachowasz, która litera wystąpiła najwięcej razy.

Wszystko opiera się na zliczaniu kolejnych wystąpień, a przy zmianie litery (do zmiennej tymczasowej) zapisujesz wystąpienia sąsiada. Jeżeli sąsiad wygrywa z tymczasowej do głównej wynik przepisujesz. Robisz aż do ost elementu (ost litery).

 

Zad 2. Po co te przedziały trzeba dzielić? Takie widzi mi się? Czy metoda rozwiązania ma się o to opierać?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

×
×
  • Dodaj nową pozycję...