[Python]ลง pyswip กับ python 3 เพื่อใช้งาน python กับ prolog สำหรับ macOS Sierra

สิ่งที่ต้องมี

  • Python 3 (test กับ 3.5.2)
  • Homebrew เจ้าเก่า
  • ถ้ายังไม่มี Homebrew ลงตามในนี้ได้ครับ

จากนั้นให้เปิด terminal แล้วใช้ command

brew install swi-prolog --HEAD

ลง swi-prolog เสร็จแล้ว ให้ใช้คำสั่ง

pip3 install git+https://github.com/yuce/pyswip

เพื่อลง pyswip ให้กับ python 3

เมื่อลงเสร็จแล้ว ให้ลองรัน python ขึ้นมาแล้ว ทดสอบการ import pyswip

from pyswip import Prolog

ถ้าไม่มีError ใดๆ ก็ถือว่าการลงเสร็จสิ้นแล้ว


หรือถ้ามี น่าจะเกิด Error คล้ายๆแบบนี้

เกิดจากการที่ swi-prolog เวอร์ชั่นหลังๆ ทำการเปลี่ยนชื่อ libpl.dylib เป็น libswipl.dylib

เพราะฉะนั้น เราต้องทำการเชื่อม libswipl.dylib ที่เรามีอยู่ ให้กลายเป็น libpl.dylib เพื่อที่ pyswip จะได้รู้จัก

ให้พิมพ์คำสั่งนี้ ใน terminal

cd /usr/local/Cellar/swi-prolog/

จากนั้นพิมพ์ ls ใน terminal

จะได้ output เป็น

HEAD-XXXX

ซึ่ง XXXX อาจจะมีค่าไม่เท่ากัน

จากนั้น พิมพ์ command

cd HEAD

แล้วกด tab 1 ครั้ง เพื่อให้ terminal เติม path ให้

จะได้เป็น

cd HEAD-XXXXXX

แล้วกด enter

จากนั้น พิมพ์

cd libexec/lib/swipl-

แล้วกด tab เหมือนเดิม เพื่อให้ terminal เติม path ให้กลายเป็น

cd libexec/lib/swipl-XXXXXX

แล้วพิมพ์ต่อ

cd libexec/lib/swipl-XXXXXX/lib/x86 แล้วกด tab

จะได้เป็น

cd libexec/lib/swipl-XXXXX/lib/x86_64-darwinXX.XX.XX/

ให้จำ path และตัวเลขที่ได้ไว้

จากนั้นให้พิมพ์ command

cd /usr/local/lib

แล้วกด enter

ตามด้วย command

ln -s ../Cellar/swi-prolog/HEAD-XXXX/libexec/lib/swipl-XXXX/lib/x86_64-darwinXXXX/libswipl.dylib

กด enter แล้วตามด้วย command

ln -s ../Cellar/swi-prolog/HEAD-XXXX/libexec/lib/swipl-XXXX/lib/x86_64-darwinXXXX/libswipl.a

โดยที่ XXXX จะเป็นค่าที่เราได้เช็คมาก่อนแล้ว

สมมติ path ของผู้เขียน จะเป็น

/Cellar/swi-prolog/HEAD-4e2f4f5_1/libexec/lib/swipl-7.3.32/lib/x86_64-darwin16.1.0

ประมาณนี้

หลังจากที่เชื่อมไฟล์ ทั้งสองแล้ว (libswipl.dylib,libswipl.a)

ให้ลองเปิด python 3 ขึ้นมา

แล้ว import pyswip ดังนี้

from pyswip import Prolog

p = Prolog()
p.assertz("father(john,ben)")
p.assertz("father(john,marry)")
a = p.query("father(john,X)")
print(list(a))

จะได้ output ดังนี้

หรือ ทดสอบด้วยการ consult ไฟล์ที่มี rule

a([1,2]).

แล้ว query ด้วยคำสั่ง

from  pyswip import Prolog
p = Prolog()
p.consult('test.pl')
a = p.query("a(X)")
print(list(a))

จะได้ output ดังนี้

ถือว่าลง pyswip ได้แล้ว โดยใช้งานได้โดยไม่มีปัญหา segmentation fault

Like what you read? Give Kajornsak P. a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.