prolog - średnia arytmetyczna i listy liczbowe

1

Witam. Oto moja sytuacja. Z prologiem nie mam, nie miałem i nie chcę mieć nic wspólnego. Muszę zrobić jedno zadanie na zaliczenie. Oto ono.

Korzystając z wbudowanych predykatów SWI Prologu zdefiniuj predykat operacja(L1, L2) spełniony, gdy lista L2 powstaje z listy L1 przez dodanie jako ostatniego elementu średniej arytmetycznej największego i najmniejszego elementu listy L1. Zakładamy, że L jest listą liczbową i ma co najmniej jeden
element (nie trzeba tego sprawdzać).

Nie wiem jak to ogarnąć i szczerze mówiąc nie chcę wiedzieć. Szanuję tych którzy to ogarniają, ale to nie dla mnie. I tu moje pytanie. Czy wie ktoś w jaki sposób mam to zrobić ? Wytłumaczyć ? Najlepiej najprościej jak się da ?

0
  1. Szukasz najmniejszego i największego elementu w L1 (można to zrobić w czasie liniowym).
  2. Liczysz średnią arytmetyczną obu wartości.
  3. Określasz, że lista L2 składa się z L1 z dodaną wyżej wartością na końcu.
  4. Profit.

Pokaż, że masz cokolwiek, inaczej wątek poleci jako próba wyłudzenia gotowca (a jak chcesz gotowca, to jest dział ogłoszenia drobne).

0

Ze względu na to, że masz napisane "Korzystając z wbudowanych predykatów SWI Prologu", to masz sprawę ułatwioną - w SWI-Prologu istnieją predykaty takie max_list/2, min_list/2 czy last/2. Więc zasadniczo wystarczy ci tylko sprawdzić czy wszystkie elementy listy L1 oraz L2 są sobie równe (poza ostatnim).

Z chęci poćwiczenia sobie Prologa napisałem rozwiązanie strasznie na około.

% https://stackoverflow.com/a/23026385
equal([],[]).
equal([H|T],[H|T1]) :- equal(T,T1).

% https://stackoverflow.com/a/32027317
list_butlast([X|Xs], Ys) :-                 % use auxiliary predicate ...
   list_butlast_prev(Xs, Ys, X).            % ... which lags behind by one item

list_butlast_prev([], [], _).
list_butlast_prev([X1|Xs], [X0|Ys], X0) :-  
   list_butlast_prev(Xs, Ys, X1).           % lag behind by one

operacja(L1, L2) :- max_list(L1, MaxL1), % liczy maksimum L1
                    min_list(L1, MinL1), % liczy minimum L1
                    Avg is (MaxL1 + MinL1) / 2, % liczy średnią
                    last(L2, Avg), % sprawdza, czy ostatni element L2 jest równoznaczny Avg
                    length(L1, LenL1), % liczy długość L1
                    LenL2 is LenL1 + 1,
                    length(L2, LenL2), % sprawdza, czy długość L2 jest równoznaczna długości L1+1
                    list_butlast(L2, L3), % wyciąga wszystkie elementy listy L2 poza ostatnim do L3
                    equal(L1, L3). % sprawdza czy L1 i L2 zawierają te same elementy w tej samej kolejności
0

mam takie coś

	msort(L1,X), %X powstaje przez posortowanie listy L1
	[H|T]=X, %odcinam glowe listy X(najmniejszy element)
	last(X,Z), %element Z to ostatni element listy X(największy element)
	Y is ((H+Z)/2),
	append(L1,Y,L2).%Lista L2 powstaje przez dodanie elementu Y do listy L1.

po wysłaniu tego do sprawdzenia otrzymałem email zwrotny o treści
"

  • niepoprawne argumenty w append

  • brak przykładów użycia predykatu operacja
    "
    jak wykonać te poprawki? Naprawdę mam już dośc tego języka...

1
  • append/3 jako wszystkie argumenty przyjmuje listy, u Ciebie 2 argument jest skalarem.
  • przedstaw przykład użycia stworzonego predykatu
0

yhym czyli append(L1,L2) powinno być ?
A co do tych przykładów użycia... jak to ma wyglądać ?

0
  1. Nie
  2. Masz pokazać przykładowy kod jak to działa. Jak nie wiesz o co chodzi, to pytaj się prowadzącego.
0

Szczerze mówiąc naprawdę nie mam pojęcia jak to ogarnąć... chyba już za długo z tym siedzę i brak mi pomysłu

2
  1. append(L1, [Y], L2)
  2. operacja([1, 2, 3], [1, 2, 3, 2])

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