prolog - średnia arytmetyczna i listy liczbowe

Odpowiedz Nowy wątek
2019-06-04 14:50
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 ?

edytowany 2x, ostatnio: Ktos, 2019-06-04 16:25
Czemu nie chcesz? Co dokładnie Ci się w nim nie podoba? - Silv 2019-06-04 22:39
Nie przemawia do mnie. Nie czuję się w nim komfortowo i zamiast nauki o Prologu wybrałem naukę pythona css html JS - Mariusz Liszewski 2019-06-06 20:56
To podobnie jak ja, tylko w moim przypadku to chyba przeważył bardziej rynek niż preferencje. :) - Silv 2019-06-06 20:57
No o rynku nie chciałem wspominać bo pod tym względem chyba nikomu nie trzeba tłumaczyć wyboru :) - Mariusz Liszewski 2019-06-06 20:58

Pozostało 580 znaków

2019-06-04 16:08
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).

Pozostało 580 znaków

2019-06-04 16:52
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
edytowany 1x, ostatnio: Ktos, 2019-06-04 17:45

Pozostało 580 znaków

2019-06-04 17:02
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...

Sformatuj to odpowiednio, bo czytać się nie da. - hauleth 2019-06-04 17:32

Pozostało 580 znaków

2019-06-04 17:35
1
  • append/3 jako wszystkie argumenty przyjmuje listy, u Ciebie 2 argument jest skalarem.
  • przedstaw przykład użycia stworzonego predykatu
edytowany 1x, ostatnio: hauleth, 2019-06-04 17:35

Pozostało 580 znaków

2019-06-04 17:53
0

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

Nie, musisz przerobić Y, aby był listą, a nie elementem. - Ktos 2019-06-04 19:06

Pozostało 580 znaków

2019-06-04 17:55
0
  1. Nie
  2. Masz pokazać przykładowy kod jak to działa. Jak nie wiesz o co chodzi, to pytaj się prowadzącego.
ehhh... dlaczego to musi być prolog... - Mariusz Liszewski 2019-06-04 17:58
Bo jest bardzo interesującym językiem. A powiedziałbym, że w Twoim kodzie z poprzedniego posta niewiele brakuje by było dobrze. - hauleth 2019-06-04 18:04
Każdy język wymaga poczytania o nim... No dobra, może są takie, które wymagają mniej... Też nie lubiłem Prologa, ale to raczej dlatego, że ja ze wszystkiego byłem słaby (nie tylko z Prologa), toteż nie miałem czasu na naukę niczego. Ale gdybym miał... - Silv 2019-06-04 22:48

Pozostało 580 znaków

2019-06-04 20:25
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

Pozostało 580 znaków

2019-06-04 20:59
  1. append(L1, [Y], L2)
  2. operacja([1, 2, 3], [1, 2, 3, 2])

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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