2014-06-23 2 views
5

Prolog를 사용하여 작은 텍스트 기반 어드벤처 게임을 작성하고 싶습니다. (이것은 어리석은 생각 일지 모르지만 그 점에 대해서는 논의하지 않았습니다.)Prolog에서 "true"및 "false"출력을 끄는 방법은 무엇입니까?

유일한 문제는 "true"및 "false"값을 표시하지 않고 화면에 텍스트를 인쇄 할 수 없다는 것입니다.

?- take(desk). 
    This thing is way too heavy for me to carry! 
    true. 

나는이 제거 할 수 방법 : take가 한 곳 술어와 desk 내가 출력으로 얻을 이름입니다

take(desk) :- write('This thing is way too heavy for me to carry!'). 

: 예를 들어

내가 좋아하는 뭔가를 시도하는 경우 "true"또는 "false"출력?

format/1 간단한 텍스트 출력을위한 하나의 장소 술어와 format/2 두 자리 술어 (변수의 이름을 출력하려고 할 때)도 똑같은 문제점을 제공합니다.

나는 또한 this answer을 보았지만 처음에는 충분히 자세하지 않았다. (적어도 나를 좋아하는 사람에게는 그렇지 않다.) 두 번째로, 나는 그 속에서 더 간단한 방법이 있기를 바란다.

그리고 마지막으로 SWI-Prolog를 사용하고 있습니다.

감사합니다.

+0

저는 prolog 초심자입니다 만,'--quiet' /'-q' 스위치를 사용하면 작동합니까? 출처 : http://www.swi-prolog.org/pldoc/doc_for?object=section(2,+%272.4%27,+swi(%27/doc/Manual/cmdline.html%27)) – Gray

+0

@ 그레이 . 어쩌면 나는 제대로 사용하지 않지만'prolog -q game.pl'을 실행하면 기본적으로 작동하지 않습니다. – gatsu

답변

9

간단한 REPL (읽기, 평가, 인쇄 루프)을 만드는 것이 가장 간단한 방법입니다. 이 같은 것 :

game :- 
    repeat, 
    write('> '), 
    read(X), 
    call(X), 
    fail. 

프롬프트에 입력 한 내용을 묻는 메시지가 표시됩니다. 당신의 take 사실과 관련하여 (또 다른 나는 그림 추가) :

take(desk) :- write('This thing is way too heavy for me to carry!'), nl. 
take(chair) :- write('This is easier to carry.'), nl. 

당신은 얻을 것이다 다음 game 목표는 해결되지 않는 true 또는 false 때문에

?- game. 
> take(desk). 
This thing is way too heavy for me to carry! 
> take(chair). 
This is easier to carry. 
> 

당신은하지 않습니다 루프를 어떻게 든 끝낼 때까지. quit 또는 bye에 대한 검사를 추가하거나 game 루프를 종료 할 수 있습니다. Ctrl-C 또는 Ctrl-D를 사용하여 루프를 중단 할 수도 있습니다. 필요에 따라 또는 원하는대로 작동하도록 다른 "기능"을 추가해야 할 수도 있습니다.

+0

놀랍지 만 그 대답은 간단합니다! 이제는 사물에 동적 인 술어를 사용하기 때문에 약간의 문제가 있습니다. 그들 중 하나는 X가 내 재고 목록에 있음을 의미하는'inventory (X) '입니다. 이것을 설명하기 위해 take (X) : - visible (X), write ('done'), assert (inventory (X)), retract (visible (X))와 같은 take 선언문을 정의한다. 인벤토리 (X), 쓰기 ('이미 가져갔습니다'). 내 문제는 루프에서 호출 할 때'take (X) '가 진리 값에 관계없이 (루프 밖에서 수행하지 않는) 두 개의 명제를 출력한다는 것입니다. 왜 그런가요? – gatsu

+0

불행히도, 나는이 순서대로 쓰여진 것을 깨달았습니다.첫 번째 (visible -> inventory) 그러면 객체가 보이 자마자 인벤토리가 전체 disjunction을 true로 만듭니다. 두 전제를 교환하면 이런 일이 일어나지 않아야합니다. – gatsu