2009-08-06 21 views
21

Czy istnieją języki programowania służące do zdefiniowania rozwiązania danego problemu, zamiast definiowania instrukcji jego rozwiązania? Tak więc można zdefiniować, jak powinno wyglądać rozwiązanie lub wynik końcowy, a tłumacz ustny będzie decydował o tym, jak osiągnąć ten wynik. Patrząc na list of programming languages, nie jestem pewien, jak nawet zacząć to badać.Języki programowania, które definiują problem zamiast rozwiązania?

Najlepsze przykłady, jakie obecnie mogę wymyślić, aby pomóc zilustrować to, o co pytam, to SQL i MapReduce, chociaż są to zarówno małe mini-języki przeznaczone do pobierania danych. Ale podczas pisania instrukcji SQL lub MapReduce definiujesz wynik końcowy, a baza danych decyduje o tym, jak najlepiej postępować, aby uzyskać końcowy zestaw wyników.

Widziałem te typy języków, jeśli istnieją, używane w chrupnięciu wielu danych lub znajdowaniu rozwiązań dla zestawu równań. Język senny byłby językiem, który mógłby zinterpretować zdefiniowany problem, zidentyfikować, które części można zrównoważyć, i wykonać rozwiązanie w wielu procesach/rdzeniach/skrzynkach.

+0

Uwielbiam pytanie, chciałbym mieć odpowiedź! –

+0

Brzmi jak inny pomysł przy przenoszeniu problemu do mnie, tak samo jak język specyfikacji :) Jeśli stworzysz coś takiego, albo stracisz dużo mocy (SQL i MapReduce są wysoce wyspecjalizowane i bezużyteczne dla ogólnych celów) lub po prostu tworzysz coś tak złożonego, jak to, co próbujesz zastąpić. – workmad3

+0

@ workmad3: Całkowicie zgadzam się, że tego typu języki będą albo wyspecjalizowane, albo zbyt absurdalnie i niepotrzebnie skomplikowane do praktycznego użytku. Wydaje się jednak, że w przypadku takich języków istniałyby nisze i nie dowiemy się, czy są one opłacalne, dopóki nie spróbujemy, prawda? –

Odpowiedz

30

Co z Declarative Programming? Fragment artykułu wikipedia (podkreślenie dodane):

W informatyce, programowanie deklaratywne to paradygmat programowania że wyraża logikę obliczeń bez opisywania jej przepływ sterowania. Wiele języków stosujące ten styl próbę zminimalizować lub wyeliminować skutki uboczne przez opisując co program powinien osiągnąć, niż opisywanie jak iść o ich spełnienie.To jest w przeciwieństwie do programowania imperatywnego , który wymaga jawnie dostarczonego algorytmu .

+0

Ah, to określenie, którego potrzebuję haha. Nienawidzę, gdy nie znasz terminu szukania/zapytaj. Również "Deklaratywne programowanie stało się ostatnio szczególnie interesujące, ponieważ może znacznie uprościć pisanie programów równoległych" - wygląda na to, że nie jestem sam! –

+0

+1 - Dokładnie to, co miałem zamiar zasugerować – Draemon

14

Najbliższe, co można uzyskać, to język logiczny, taki jak Prolog. W tych językach modelujesz logikę problemu, ale znowu nie jest to magia.

+1

Tak, trudno jest sobie wyobrazić, jak to wyglądałoby/mogłoby wyglądać praktycznie z powodu magicznego czynnika. Ile magii to za dużo? Prolog wygląda jednak na doskonały przykład. –

+0

To jest dokładnie ten przykład, o którym myślałem, kiedy czytałem pytanie. Po użyciu Prologu przez chwilę zdajesz sobie sprawę, dlaczego ten paradygmat jest tak rzadko emulowany. – Beska

12

Brzmi to jak opis języka deklaratywnego (w szczególności logicznego języka programowania), którego najbardziej znanym przykładem jest Prolog. Nie mam pojęcia, czy Prolog jest zrównoleglony.

Z mojego doświadczenia wynika, że ​​Prolog doskonale nadaje się do rozwiązywania problemów z ograniczeniem ograniczeń (takich, w których istnieje zestaw warunków, które muszą być spełnione) - definiujesz swój zestaw wejściowy, definiujesz ograniczenia (np. Porządek, który musi zostać nałożony) na wcześniej nieuporządkowanych danych wejściowych) - ale możliwe są przypadki patologiczne, a czasami proces wnioskowania logicznego zajmuje bardzo dużo czasu.

Jeśli możesz zdefiniować swój problem za pomocą formuły Boolean, możesz rzucić na nią solver SAT, ale zwróć uwagę, że problem 3SAT (Boolean przypisanie zmiennych przez trzy zmienne) jest NP-complete, a jego pierwszy Wielkie bractwo porządkowe, problem z formułą Quantified Boolean (który wykorzystuje kwantyfikator egzystencjalny oraz kwantyfikator uniwersalny), jest kompletny w PSPACE.

Istnieje kilka bardzo dobrych dowodów twierdzeń napisanych w języku OCaml i innych językach FP; here to ich cała masa.

Oczywiście zawsze jest programowanie liniowe za pomocą metody simplex.

+1

Prolog jest bardzo podobny do równoległego. Kolejność oceny klauzul może się zdarzyć w dowolnej kolejności, a nawet w tym samym czasie. –

+0

Awesome. Używałem go tylko na maszynach jednoprocesorowych, a nawet niezbyt wiele. Dzięki za punkt danych! –

3

Pozwól mi spróbować odpowiedzieć ... może być Prolog może odpowiedzieć na twoje potrzeby.

4

Języki te są powszechnie nazywane 5th generation programming languages. Jest kilka przykładów na wpisie w Wikipedii, do którego się przyłączyłem.

+0

Jak często jest "powszechnie", gdy nigdy nie słyszałem o językach programowania sklasyfikowanych w tym znaczeniu "generacji"? – erjiang

0

Dostępne są różne mechanizmy reguł oparte na języku Java, które umożliwiają programowanie deklaratywne - Drools, z którym grałem i wydaje się całkiem interesujące.

0

Wiele języków zdefiniować więcej problemów niż rozwiązań (nie brać tego na serio).

Poważnie: jeszcze jeden głos na Prolog i różne rodzaje DSL, które mają być deklaratywne.

0

Pamiętam, że przeczytałem coś o obliczeniach, używając DNA, kiedy byłem na studiach. Wstawiasz segmenty DNA do rozwiązania, które reprezentuje segmenty problemu, i definiujesz je w taki sposób, że jeśli DNA pasuje do siebie, jest to prawidłowe rozwiązanie. Następnie pozwalasz, aby właściwości chemikaliów rozwiązały twój problem i poszukują gotowych pasm, które stanowią rozwiązanie. Brzmi to trochę tak, jak mówisz.

Nie pamiętam, czy to było teoretyczne, czy zostało zrobione.

+0

Jeśli możesz go znaleźć, byłoby to niezwykle interesujące. –

+0

Wciskając, myślę, że mogłem zostać zawieszony przed tym wykładem. Nie mogę znaleźć żadnych odniesień do używania rzeczywistego DNA do obliczeń. – quillbreaker

+0

Poszukaj "komputerów biologicznych" lub "biokomputerów". http://news.nationalgeographic.com/news/2003/02/0224_030224_DNAcomputer.html http://pl.wikipedia.org/wiki/Biocomputers – outis

1

To może wydawać się niepoważne, ale w pewnym sensie to właśnie jest stackoverflow. Deklarujesz problem i lub zamierzony rezultat, a społeczność dostarcza rozwiązanie, zwykle w kodzie.

Wydaje się niezmiernie trudno modelować systemy dynamiczne otwarte aż do skończonej liczby rozwiązań. Myślę, że jest powód, dla którego większość języków programowania jest niezbędna. Nie wspominając o wielkich problemach P = NP czyhających w ciemnościach, które sprawiłyby, że taki system byłby trudny do zaprojektowania.

Chociaż byłoby interesujące, gdyby istniały formalne ramy, które mogłyby wesprzeć ludzki wkład w "przełamanie liczb" i dostarczyć rozwiązania, być może imperatywnego generowania kodu. Wyszukiwarki internetowe i wyszukiwarki Google są tego rodzaju narzędziem, ale są bardzo prymitywne.

Duże problemy i oprogramowanie to po prostu zbiór mniejszych problemów rozwiązanych w kodzie. Zatem każdy system, który wygenerował kod, wymagałby dość ograniczonych zestawów problemów, które można odwzorować na więcej lub mniej rozwiązań atomowych.

0

LINQ można również uznać za inny deklaratywny DSL (nie zgłaszając argumentu, że jest zbyt podobny do SQL). Ponownie deklarujemy, jak wygląda twoje rozwiązanie, a LINQ decyduje, jak je znaleźć.

Piękno tego rodzaju języków polega na tym, że projekty takie jak PLINQ (które właśnie znalazłem) mogą się do nich zbliżać. Check out this video with the PLINQ developers (Bezpośredni link WMV) o tym, w jaki sposób są one równoległe do znalezienia rozwiązania bez modyfikowania języka LINQ (dużo).

1

Lisp. Istnieje tak wiele systemów Lisp, które są zdefiniowane w kategoriach reguł, a nie poleceń imperatywnych. Google ahoy ...

0

Podczas gdy dowody matematyczne nie stanowią języka programowania, tworzą formalny język, w którym po prostu definiujesz rozwiązania (o ile pozwalasz na niekonstruktywne dowody). Oczywiście nie jest to algorytmiczne, więc "matematyka" może nie być akceptowalną odpowiedzią.

Powiązane problemy