Prolog

Prowadzący: Krzysztof Zając

Skrypt: [http://sg.0x04.net/~kazet/skrypt.pdf]

Na warsztatach spróbujemy spojrzeć trochę inaczej na programowanie. Będzie o tym:
* Jak mówić komputerowi, jaki problem będziemy rozwiązywać i kazać mu samemu wymyśleć jak.
* Jak cofać się w czasie.
* Jak zrobić, żeby komputer przestał zachowywać się jak pracowity idiota (tak jak w C/C++/Pascalu) a zaczął jak matematyk.

A potem będziemy robić większe zadanie: może będziemy pisać program rozwiązujący łamigłówki: obrazki logiczne, sudoku itp., może jakiś prosty program do obliczeń symbolicznych (coś na kształt Mathematiki, a może bardziej Wolframa), albo coś zupełnie innego (jeśli przyjdzie nam do głowy).

Wymagania

* Znajomość dowolnego języka programowania (chodzi o odrobinę doświadczenia: trzeba będzie wiedzieć co to jest pętla, zmienna itp.). Jeśli nigdy nie programowałeś/aś, a chcesz wziąć udział - napisz maila, coś wymyślimy.
* Znajomość logiki na poziomie liceum (rachunek zdań, wnioskowanie).
* Jeśli będziesz miał/a na warsztatach laptopa, to miej na nim SWI-Prolog. Jeśli nie wiesz, jak się go instaluje - napisz maila.

Zadania

Dana jest następująca definicja listy:

type 
  PList = ^List; { pusta lista to nil }
  List = record
    n: Integer;
    next: PList;
  end;

lub w C:

struct list {
  int n;
  struct list *next; /* pusta lista to NULL */
}

Przykładowo, w C, lista pierwszych pięciu liczb Fibonacciego może być skonstruowana tak:

struct list a, b, c, d, e;
a.n = 1;
a.next = &b;
b.n = 1;
b.next = &c;
c.n = 2;
c.next = &d;
d.n = 3;
d.next = &e;
e.n = 5;
e.next = NULL;

Listę reprezentuje oczywiście wskaźnik do danej struktury.

Napisz (w Pascalu, w C lub w C++) funkcję, która dla danej listy
1a. zwraca sumę jej elementów,
1b. zwraca listę, składającą się z elementów danej listy podzielnych przez 3,
1c. zwraca listę, składającą się z elementów danej listy podzielonych przez 3,
1d*. zwraca odwróconą wersję danej listy
1e**. zwraca posortowaną wersję danej listy

(najlepiej, jeśli pierwotna lista nie ulegnie przy tym modyfikacji).

Nie wolno ci korzystać z pętli (while, for, repeat, goto, …).

Uwaga dla osób broniących własności intelektualnej: tak, zrobiłem bezczelnego copypasta. Tak, mam zgodę Pawła.

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License