Jak wdrożyć programy interaktywne (takie jak gry / symulacje) przy użyciu programowania logiki?

20

Słyszałem, że programowanie logiki może służyć jako alternatywa ogólnego przeznaczenia dla innych paradygmatów programowania, takich jak programowanie OO lub programowanie funkcjonalne. (Ponieważ Prolog jest kompletny w Turinga, musi tak być!)

Mam jednak problem z widzeniem, jak zaimplementować program interaktywny, taki jak prosta, graficzna gra konsolowa w Prologu lub w podobnym języku. Masz fakty, zasady, które mogą wyprowadzić więcej faktów, i zapytania, które je wyszukują. Łatwo jest zobaczyć, jak można użyć tych podstawowych elementów do stworzenia czegoś takiego jak solver sudoku. Ale co powiesz na Pac-mana lub prościej na Ponga?

UWAGA: Nie szukam szczegółów niskiego poziomu, ale przegląd koncepcyjny. (Na przykład: w kategoriach wysokiego poziomu, jak poradziłbyś sobie z wejściami / wyjściami? Jak zapisałbyś stan gry? Jak wdrożyłbyś coś w rodzaju „głównej pętli”? Jak zmierzyłbyś i zareagował na upływ czasu? )

Alex D.
źródło
1
Naprawdę podoba mi się twoje pytanie - dawno temu nauczył mnie Prolog i zadałem sobie to samo Pytanie i nigdy nie byłem w stanie wymyślić sposobu, aby to zrobić.
Christian Sauer,
Osobiście prowadziłem kurs programowania logicznego implementujący klon Frozen Bubbles w SWI Prolog. Działało jak urok (po dziesiątym dniu wydajność spadła, ponieważ sama gra była przyjemniejsza niż dodawanie funkcjonalności). Link do strony internetowej uni jest zepsuty, ale postaram się sprawdzić, czy mogę ponownie udostępnić kod.
Kilian Foth,
2
„Ponieważ Prolog jest kompletny w Turinga, musi tak być!” - Nie całkiem. Prolog będący kompletną metodą Turinga oznacza, że ​​każda funkcja matematyczna liczb naturalnych, którą można obliczyć za pomocą Maszyny Turinga, może być obliczona przez Prolog. Ale nie mówi nic o algorytmach, które nie są funkcjami matematycznymi na liczbach naturalnych. Na przykład: czy system operacyjny jest funkcją matematyczną liczb naturalnych? Serwer www? Gra? Drukujesz na konsoli? Prowadzisz robota? Nie mam wątpliwości, że wszystko to można zrobić w Prologu, ale niekoniecznie wynika to z tego, że Prolog jest kompletny.
Jörg W Mittag,
@ JörgWMittag: Innymi słowy, może to być możliwe, ale może nie być praktyczne?
Robert Harvey
1
@ JörgWMittag - Tak, wszystkie z nich są po prostu matematyką i przechowywaniem liczb.
Bobson,

Odpowiedzi:

9

Śledzenie stanu gry nie różni się od stanu śledzenia w żadnym innym programie Prolog. Definiujesz fakty, a następnie wykorzystujesz je do podejmowania decyzji. Jest dość stary, ale artykuł Exploring Prolog: Adventures, Objects, Animals, and Taxes dobrze wyjaśnia, jak to może działać w grze. Podsumowane z artykułu:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

Poza tym potrzebujesz grafiki i biblioteki IO. Mogą istnieć komercyjne dystrybucje Prolog, które je zawierają. Najbardziej znam SWI Prolog , więc proponuję plOpenGL jako punkt wyjścia. Nie tylko daje ci dostęp do możliwości renderowania OpenGL, ale także zawiera powiązania dla zdarzeń myszy i klawiatury. Na przykład, aby obsłużyć naciśnięcie klawisza Escape, zdefiniuj regułę klawiatury w następujący sposób:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

Spójrz na przykład ruchomego światła plOpenGL, aby uzyskać więcej szczegółów i przykład obsługi ruchu myszy.

Jeśli korzystasz z biblioteki graficznej, prawdopodobnie obsłuży ona pętlę gry. Zasadniczo odwracasz kontrolę nad biblioteką i udostępniasz reguły, które należy wykonać w odpowiednich przypadkach: konfigurowanie, odświeżanie, zdarzenia we / wy itp. Jeśli chcesz ograniczyć liczbę klatek na sekundę lub uruchomić kod warunkowo na podstawie czasu, możesz śledzić upływ czasu za pomocą godziny / daty dokonuje predykcji i odpowiednio podejmuje decyzje.

Istnieje wiele smaków Prologa, więc z pewnością nie jest to jedyny sposób na zbudowanie gry. Różne dystrybucje i powiązane języki będą używać różnych bibliotek / powiązań, które mogą zachęcać do różnych podejść. Ponadto programiści oprogramowania Polyglot mogą zachęcać do korzystania z bardziej „przyjaznego graficznie” języka hosta / środowiska wykonawczego do zarządzania renderowaniem i operacjami we / wy podczas korzystania z programu Prolog do modelowania zachowań podmiotów i podejmowania decyzji.

Corbin March
źródło
1
Ta sama strona, do której linkujesz , zawiera również dłuższy samouczek Adventure in Prolog , który uznałem za przydatny i który kończy się także opracowaniem prostej tekstowej gry przygodowej.
jscs,
Świetny! Właśnie tego szukałem. writeWydaje mi się, że uwzględnienie operacji z efektami ubocznymi (jak ) w „logicznym predykacie” wydaje się zagiąć tę koncepcję dość daleko.
Alex D
2

Oprócz odpowiedzi Corbina : w stanie ogólnym można przechowywać / odzyskiwać w Prologu za pomocą predykatów assert / retract. Istnieje jednak wiele niestandardowych opcji, takich jak zapis do RDF, XML, relacyjnych baz danych itp. Jeśli chcesz mieć GUI, jednym z przykładów jest XPCE oferowany przez SWI-Prolog.

Należy zauważyć, że chociaż wdrożenie pełnej gry w programowaniu logicznym jest dobrym ćwiczeniem, w praktyce jej wydajność byłaby nieodpowiednia i dlatego dostawcy tacy jak SWI-Prolog oferują powiązania z językami niższego poziomu (np. Java, C ++ itp.). Nawet wdrożenie prostego rozwiązania Sudoku wymaga użycia bibliotek CLP .

sakisk
źródło