논리 프로그래밍을 사용하여 게임 / 시뮬레이션과 같은 대화식 프로그램을 구현하는 방법은 무엇입니까?


20

논리 프로그래밍이 OO 또는 함수형 프로그래밍과 같은 다른 프로그래밍 패러다임에 대한 범용 대안으로 사용될 수 있다고 들었습니다. (프롤로그가 튜링 완료되었으므로 반드시 그래야합니다!)

그러나 Prolog의 간단한 그래픽 콘솔 게임 또는 유사한 언어와 같은 대화 형 프로그램을 구현하는 방법을 보는 데 어려움을 겪고 있습니다. 사실, 더 많은 사실을 도출 할 수있는 규칙 및 사실을 검색하는 쿼리가 있습니다. 이러한 기본 요소를 사용하여 스도쿠 솔버와 같은 것을 만드는 방법을 쉽게 알 수 있습니다. 그러나 Pac-man 또는 더 간단히 Pong은 어떻습니까?

참고 사항 : 저수준 세부 정보가 아니라 개념적인 개요를 찾고 있습니다. (예 : 높은 수준의 용어로 I / O를 어떻게 처리하고 게임 상태를 어떻게 저장합니까? "메인 루프"와 같은 것을 어떻게 구현 하시겠습니까? 시간이 지남에 따라 어떻게 측정하고 응답 하시겠습니까? )


1
나는 당신의 질문을 정말로 좋아합니다-나는 오래 전에 프롤로그를 생각하고 같은 질문을했고 결코 이것을 할 수있는 방법을 생각할 수 없었습니다.
Christian Sauer

SWI Prolog에서 Frozen Bubbles 클론을 구현하는 논리 프로그래밍 과정을 개인적으로 운영했습니다. 매력처럼 작동했습니다 (10 일 만에 기능을 추가하는 것보다 재생하는 것이 더 재미있어 생산성이 떨어졌습니다). uni 웹 사이트 링크가 손상되었지만 코드를 다시 사용할 수 있는지 확인하려고합니다.
Kilian Foth

2
"프롤로그가 튜링 완료되었으므로 반드시 그래야합니다!" – 실제로는 아닙니다. 튜링이 완료된 프롤로그 란 튜링 머신으로 계산할 수있는 자연수에 대한 모든 수학 함수를 프롤로그로 계산할 수 있음을 의미합니다. 그러나 자연수에 대한 수학 함수가 아닌 알고리즘에 대해서는 언급하지 않습니다. 예를 들어 : 운영 체제가 자연수에 대한 수학 함수입니까? 웹 서버? 게임? 콘솔로 인쇄 하시겠습니까? 로봇을 운전? 이 모든 것들이 Prolog에서 수행 될 수 있다는 것은 의심의 여지가 없지만, 반드시 Prolog가 Turing-complete 인 것은 아닙니다.
Jörg W Mittag

@ JörgWMittag : 즉, 가능할 수도 있습니다. 실용적이지 않을 수도 있습니까?
Robert Harvey

1
@ JörgWMittag-그렇습니다. 모두 마음에 든 수학과 저장 공간입니다.
Bobson

답변:


9

게임 상태 추적은 다른 Prolog 프로그램의 추적 상태와 다르지 않습니다. 사실을 정의한 다음이를 사용하여 결정을 내립니다. 꽤 오래되었지만 프롤로그 탐색 : 모험, 사물, 동물 및 세금 기사 는 이것이 게임에서 어떻게 작동하는지 설명하는 데 효과적입니다. 기사에서 요약 :

% 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.

그 외에도 그래픽과 IO 라이브러리가 필요합니다. 상용 Prolog 배포판이 포함되어있을 수 있습니다. SWI Prolog에 대해 가장 잘 알고 있으므로 plOpenGL 을 시작점으로 제안 합니다. OpenGL의 렌더링 기능에 액세스 할 수있을뿐만 아니라 마우스 및 키보드 이벤트에 대한 바인딩도 포함합니다. 예를 들어, Esc 키를 누르면 키보드 규칙을 다음과 같이 정의합니다.

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

plOpenGL의 움직이는 조명 예제 에서 몇 가지 자세한 내용과 마우스 움직임 처리 예제 를 살펴보십시오 .

그래픽 라이브러리를 사용하면 게임 루프를 처리 할 수 ​​있습니다. 기본적으로 라이브러리로 제어를 전환하고 설정, 다시 그리기, IO 이벤트 등 적절한 경우 실행할 규칙을 제공합니다. FPS를 제한하거나 시간을 기준으로 조건부로 코드를 실행하려는 경우 시간 / 날짜를 사용하여 경과 시간을 추적 할 수 있습니다 술어 와 그에 따라 결정을 내립니다.

많은 프롤로그 맛이 있으므로 이것이 게임을 만드는 유일한 방법은 아닙니다. 다른 배포판과 관련 언어는 다른 접근 방식을 장려 할 수있는 다른 라이브러리 / 바인딩을 사용합니다. 또한, 폴리 글 로트 프로그래머는 프롤로그를 사용하여 게임 엔티티 동작 및 의사 결정을 모델링하는 동안 렌더링 및 IO를 관리하기 위해보다 "그래픽 친화적"호스트 언어 / 런타임을 사용하도록 권장 할 수 있습니다.


1
귀하가 링크 한 동일한 사이트에는 더 긴 튜토리얼 인 Adventure in Prolog 도 포함되어 있습니다.이 튜토리얼 은 유용한 것으로 나타 으며 간단한 텍스트 기반 어드벤처 게임 개발로 끝났습니다.
jscs

큰! 이것이 내가 찾던 것입니다. write"논리적 술어"에 부작용 (예 :)을 포함하는 작업을 포함 시키는 것이 개념을 훨씬 멀리 구부린 것 같습니다.
Alex D

2

Corbin의 답변 맨 위에 : 일반적으로 assert / retract 술어를 사용하여 Prolog에 상태를 저장 / 검색 할 수 있습니다. 그러나 RDF, XML, 관계형 데이터베이스 등에 저장하는 것과 같은 많은 비표준 옵션이 있습니다. GUI를 원한다면 SWI-Prolog에서 제공하는 XPCE 가 있습니다.

논리 프로그래밍에서 완전한 게임을 구현하는 것이 좋은 연습이지만 실제로는 성능이 부적절하기 때문에 SWI-Prolog와 같은 공급 업체가 하위 언어 (예 : Java, C ++ 등)에 대한 바인딩을 제공합니다. 간단한 스도쿠 솔버를 구현하더라도 CLP 라이브러리를 사용해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.