วิธีการใช้โปรแกรมแบบโต้ตอบ (เช่นเกม / การจำลอง) โดยใช้การเขียนโปรแกรมเชิงตรรกะ?


20

ฉันได้ยินมาว่าการเขียนโปรแกรมเชิงตรรกะสามารถใช้เป็นทางเลือกทั่วไปสำหรับกระบวนทัศน์การเขียนโปรแกรมอื่นเช่น OO หรือการเขียนโปรแกรมเชิงฟังก์ชัน (เนื่องจาก Prolog เสร็จสมบูรณ์แล้วจึงต้องเป็นเช่นนี้!)

อย่างไรก็ตามฉันมีปัญหาในการดูว่าจะใช้โปรแกรมอินเทอร์แอคทีฟได้อย่างไรเช่นเกมคอนโซลกราฟิกที่เรียบง่ายใน Prolog หรือภาษาที่คล้ายกัน คุณมีข้อเท็จจริงกฎที่สามารถรับข้อเท็จจริงเพิ่มเติมและแบบสอบถามที่ดึงข้อเท็จจริง มันง่ายที่จะดูว่าคุณสามารถใช้องค์ประกอบพื้นฐานเหล่านั้นเพื่อสร้างบางสิ่งเช่นตัวแก้ซูโดกุได้อย่างไร แต่วิธีการเกี่ยวกับแพคแมนหรือมากกว่านั้นอย่างง่ายพงษ์?

โปรดทราบ:ฉันไม่ได้มองหารายละเอียดในระดับต่ำ แต่เป็นภาพรวมแนวคิด (ตัวอย่างเช่น: ในเงื่อนไขระดับสูงคุณจะจัดการ I / O อย่างไรคุณจะเก็บสถานะของเกมอย่างไรคุณจะใช้บางอย่างเช่น "วนรอบหลัก" อย่างไรคุณจะวัดและตอบสนองต่อเวลาที่ผ่านไปอย่างไร )


1
ฉันชอบคำถามของคุณมาก - ฉันถูกโพรล็อกเมื่อนานมาแล้วและถามคำถามเดียวกันกับตัวเองและไม่สามารถคิดวิธีการทำสิ่งนี้ได้
คริสเตียนซาวเออร์

ฉันใช้หลักสูตรการเขียนโปรแกรมเชิงตรรกะเป็นการส่วนตัวนำไปใช้กับโคลนนิ่งแช่แข็งใน SWI Prolog ทำงานเหมือนมีเสน่ห์ (หลังจากวันที่สิบผลิตผลลงเพราะเพียงแค่เล่นมันสนุกกว่าการเพิ่มฟังก์ชั่น) ลิงก์ของเว็บไซต์ uni นั้นใช้งานไม่ได้ แต่ฉันจะพยายามดูว่าฉันจะทำให้รหัสนั้นสามารถใช้ได้อีกครั้งหรือไม่
Kilian Foth

2
"เนื่องจาก Prolog เสร็จสมบูรณ์แล้วจึงต้องทำเช่นนี้!" - ไม่จริง อารัมภบทการทำให้สมบูรณ์ทัวริงหมายความว่าฟังก์ชันทางคณิตศาสตร์ใด ๆในจำนวนธรรมชาติที่สามารถคำนวณได้โดยเครื่องทัวริงสามารถคำนวณได้โดย Prolog แต่มันไม่ได้พูดอะไรเกี่ยวกับอัลกอริธึมที่ไม่ใช่ฟังก์ชันทางคณิตศาสตร์กับจำนวนธรรมชาติ ตัวอย่างเช่น: ระบบปฏิบัติการเป็นฟังก์ชันทางคณิตศาสตร์ของตัวเลขธรรมชาติหรือไม่? เว็บเซิร์ฟเวอร์? เกม? กำลังพิมพ์ไปที่คอนโซลหรือไม่ ขับรถหุ่นยนต์? ฉันไม่สงสัยเลยว่าสิ่งเหล่านี้สามารถทำได้ใน Prolog แต่มันไม่จำเป็นต้องทำตามจาก Prolog ที่กำลังทำให้ทัวริงสมบูรณ์
Jörg W Mittag

@ JörgWMittag: ในคำอื่น ๆ มันอาจเป็นไปได้มันก็อาจจะไม่ได้ในทางปฏิบัติ?
Robert Harvey

1
@ JörgWMittag - ใช่แล้วพวกเขาทั้งหมดเป็นเพียงแค่เลขและเลขในใจ
Bobson

คำตอบ:


9

สถานะของเกมการติดตามไม่แตกต่างจากสถานะการติดตามในโปรแกรม Prolog อื่น ๆ คุณกำหนดข้อเท็จจริงแล้วใช้เพื่อตัดสินใจ มันค่อนข้างเก่า แต่บทความExploring 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 แต่ยังรวมถึงการเชื่อมโยงสำหรับเหตุการณ์เมาส์และคีย์บอร์ด ตัวอย่างเช่นหากต้องการจัดการการกดปุ่ม Escape คุณจะต้องกำหนดกฎของแป้นพิมพ์ดังนี้:

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

ดูตัวอย่างแสงที่เคลื่อนที่ได้ของ plOpenGL เพื่อดูรายละเอียดเพิ่มเติมเล็กน้อยและตัวอย่างการจัดการการเคลื่อนไหวของเมาส์

หากคุณใช้ไลบรารีกราฟิกมันอาจเป็นไปได้ที่จะจัดการลูปเกมให้คุณ โดยทั่วไปคุณกลับควบคุมไลบรารีและกำหนดกฎที่จะดำเนินการเมื่อเหมาะสม: ตั้งค่า, ทาสี, เหตุการณ์ IO ฯลฯ หากคุณต้องการ จำกัด FPS หรือเรียกใช้รหัสตามเงื่อนไขตามเวลาคุณสามารถติดตามเวลาที่ผ่านไปโดยใช้เวลา / วันที่ เพรดิเคตและตัดสินใจตามความเหมาะสม

มีรสชาติของ Prolog มากมายดังนั้นนี่จึงไม่ใช่วิธีเดียวในการสร้างเกม การแจกแจงที่แตกต่างกันและภาษาที่เกี่ยวข้องจะใช้ไลบรารี / การเชื่อมโยงที่อาจสนับสนุนวิธีการที่แตกต่างกัน นอกจากนี้โปรแกรมเมอร์หลายภาษาอาจสนับสนุนให้คุณใช้ภาษาโฮสต์ / มิตร "กราฟิกที่เป็นมิตร" มากขึ้นในการจัดการการเรนเดอร์และ IO ในขณะที่ใช้ Prolog เพื่อจำลองพฤติกรรมของเอนทิตีเกมและการตัดสินใจ


1
ไซต์เดียวกันที่คุณเชื่อมโยงไปยังมีการสอนเพิ่มเติมที่ยาวกว่าAdventure in Prologซึ่งฉันพบว่ามีประโยชน์และจบลงด้วยการพัฒนาเกมผจญภัยที่ใช้ข้อความเป็นตัวอักษร
jscs

ที่ดี! นี่คือสิ่งที่ฉันกำลังมองหา ฉันรู้สึกว่ารวมถึงการดำเนินงานที่มีผลข้างเคียง (เช่นwrite) ใน "ตรรกะภาค" ดูเหมือนว่าจะทำให้งอแนวคิดค่อนข้างไกล
Alex D

2

ด้านบนของคำตอบของ Corbin : ในสถานะทั่วไปสามารถจัดเก็บ / ดึงใน Prolog โดยใช้ยืนยัน / retract predicates แต่มีตัวเลือกที่ไม่ได้มาตรฐานมากมายเช่นการบันทึกลงใน RDF, XML, ฐานข้อมูลเชิงสัมพันธ์เป็นต้นหากคุณต้องการ GUI ตัวอย่างหนึ่งคือXPCE ที่เสนอโดย SWI-Prolog

โปรดทราบว่าถึงแม้ว่าการใช้งานเกมที่สมบูรณ์ในการเขียนโปรแกรมลอจิกเป็นการออกกำลังกายที่ดี แต่ในทางปฏิบัติประสิทธิภาพของเกมนั้นไม่เพียงพอและนั่นเป็นสาเหตุที่ผู้ขายอย่าง SWI-Prolog เสนอการเชื่อมโยงกับภาษาระดับล่าง (เช่น Java, C ++ เป็นต้น) แม้แต่การนำ Sudoku Solver ธรรมดามาใช้ก็ต้องใช้CLPไลบรารี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.