ชาวนา กับ หมาป่า มี แพะ และกะหล่ำปีด้วย

        วันนี้มาดูกันว่าเราจะพา ชาวนา (f, farmer) หมาป่า (w, wolf) แพะ (g, goat) และกะหล่ำปี (c, cabbage) ข้ามแม่น้ำจากฝั่งซ้าย (w, west) ไปฝั่งขวา (e, east) ได้อย่างไร มาทดลองเขียนโดยใช้ LISP

        1.เริ่มต้น ด้วยการกำหนดตัวแปรของข้อมูลก่อน โดยใช้ ADT

1.1 list ของสัญลักษณ์ farmer, wolf, goat, cabbage ใช้เป็นตัวย่อ f, w, g, c เขียนในรูปแบบของ LISP จะได้ (f w g c)

1.2 list สัญลักษณ์ ฝั่งของแม่น้ำ west, w และ east, e ใช้ร่วมกับ list ของfarmer, wolf, goat, cabbage เพื่อแทน หรือแสดงว่า แต่ละอย่างอยู่ฝั่งไหนของแม่น้ำ เช่น (w w w w) เมื่อเทียบกับ (f w g c) แล้วมีความหมายว่า ทุกอย่างอยู่ฝั่งซ้าย (ตะวันตก, west, w) และมีสถานะปลอดภัย

 

        2.สถานะปลอดภัย

        ตัวอย่างนี้จะกำหนดเงื่อนไขสถานะที่ไม่ปลอดภัยก่อน โดยใช้ cond ถ้าไม่ปลอดภัยก็จะส่งค่ากลับเป็น nil (false, เท็จ) ถ้าปลอดภัยก็จะส่งค่ากลับเป็น t (true, จริง)

        สถานะที่ไม่ปลอดภัย แพะ (goat, g) และหมาป่า (wolf, w) อยู่ฝั่งเดียวกัน where-goat side และ where-wolf side มีค่าเท่ากัน เขียนด้วย LISP จะได้เป็น

                (equal (where-goat side) (where-wolf side))

ถ้า (where-goat side) และ (where-wolf side) มีค่าเท่ากันจะได้ผลเป็นจริง

        เมื่อตรวจสอบโดยใช้ cond จะได้

        (cond(

                        (equal (where-goat side) (where-wolf side))

                nil )

        (t side))

แต่ถ้ามีชาวนาอยู่ด้วย(อยู่ฝั่งเดียวกัน) ก็จะอยู่ในสถานะปลอดภัย

ถ้าไม่อยู่ก็ไม่ปลอดภัย ไม่ ใน LISP ใช้ not จะได้ code เพิ่มเป็น

        (not

                (equal (where-farmer side) (where-wolf side) )

        )

เมื่อรวมทั้งสองกรณี ใน LISP จะเชื่อมกันด้วย and จะได้

(cond(

        (and

                        (equal (where-goat side) (where-wolf side)

                        );end equal

                (not

                        (equal (where-farmer side) (where-wolf side)

                        );end equal

                );end not

        );end and

   nil)

   (t side)

);end cond

 

ตอนนี้แค่นี้ก่อน ลองไปเขียนเงื่อนไขอื่นดูอีก