How to call Prolog with PHP
ก่อนอื่นเลยเราต้องลง Prolog Compiler ที่เครื่อง Server ก่อน ซึ่งสามารถดูที่ได้ http://www.swi-prolog.org/build/ จากลิ้งจะเห็นได้ว่ามันจะแตกต่างจาก SWI-Prolog Client ที่เอาไว้ทดสอบ Prolog Query
Prolog Compiler นั้นมี Platform มากมายที่รองรับได้แก่ Unix, MacOS, Windows และ Android
How to install Prolog Compiler on MacOS
ก่อนอื่นเลยก็ต้องลงตัว Installer บน MacOS ก่อน ได้แก่ Macports, Homebrew เป็นต้น ซึ่งจริง ๆ แล้วพวก Installer เหล่านี้มันคือแหล่งรวม Library ที่เป็น Open source ดังรูปด้านล่าง
จากนั้นเริ่มลง Prolog Compiler ด้วยคำสั่งด้านล่างดังนี้
ลงผ่าน Macport
$ port install swi-prolog
ลงผ่าน Homebrew
$ brew install swi-prolog
เมื่อลงเสร็จเรียบร้อยแล้วให้เปิด Terminal ขึ้นมาทดลองพิมพ์ดังด้านล่าง
$ swipl
จะแสดงผลดังด้านล่าง
และทดสอบ Prolog Compiler โดยการพิมพ์คำสั่ง
$ write(“Hello Prolog”).
ถัดไปมาลองเขียน PHP เพื่อที่จะติดต่อไปยัง Prolog Compiler กัน ซึ่งมีเว็บที่สอนเชื่อมต่อ Prolog from PHP อยู่ ได้แก่ http://www.j-paine.org/dobbs/prolog_from_php.html
ซึ่งลิ้งนี้อธิบายค่อนข้างชัดเจน แต่ผมจะขอขยายความจากเว็บนี้ละกันนะครับ
ก่อนอื่นเลยสร้าง Fact file ขึ้นมาแล้วใส่ Facts ดังตัวอย่าง
test.pl
test :-write( ‘Prolog \nwas called \nfrom PHP \nsuccessfully.’ ).
สร้างนั้นสร้าง PHP file ขึ้นมาดังตัวอย่าง
index.php
<HTML><HEAD><TITLE>Calling SWI-Prolog</TITLE></HEAD><P><PRE><?$cmd = “nice -n15 /opt/local/bin/swipl -f test.pl -g test,halt”;system( $cmd );echo “\n\n”;$output = exec( $cmd );echo $output;echo “\n\n”;exec( $cmd, $output );print_r( $output );echo “\n”;$output = shell_exec( $cmd );echo $output;echo “\n\n”;?></PRE></P></BODY></HTML>
**ในส่วนของคำสั่ง Prolog Query นั้นจะอยู่ในรูปแบบของ
nice –n15 Prolog_Compiler_Path –f Fact_File_Path –g Prolog_Query
ซึ่งทุก ๆ Query เราควรจะปิดด้วย halt เพื่อ Terminate prolog ทุกครั้ง ซึ่งถ้าต้องการดู Command line options เพิ่มเติมสามารถดูได้ที่ http://www.swi-prolog.org/pldoc/man?section=cmdline
ผลลัพธ์
Prologwas calledfrom PHPsuccessfully.successfully.Array([0] => Prolog[1] => was called[2] => from PHP[3] => successfully.)Prologwas calledfrom PHPsuccessfully.
ถ้าขึ้นแบบด้านบนแล้วแสดงว่า PHP สามารถเชื่อมต่อกับ Prolog ได้แล้ว แต่เอาเข้าจริง ๆ มันก็ไม่ใช่ PHP หลอกที่เชื่อมต่อกับ Prolog Compiler แต่กลับเป็นตัว Terminal เองที่ถูก PHP execute prolog query ลงไป
จากด้านบนเรามาลองวิเคราะห์คำสั่ง PHP กัน
<?$cmd = “nice -n15 /opt/local/bin/swipl -f test.pl -g test,halt”;echo “<b>= = = = Optional 1 = = = =</b>\n”;system( $cmd );echo “\n\n”;echo “<b>= = = = Optional 2 = = = =</b>\n”;$output = exec( $cmd );echo $output;echo “\n\n”;echo “<b>= = = = Optional 3 = = = =</b>\n”;exec( $cmd, $output );print_r( $output );echo “\n”;echo “<b>= = = = Optional 4 = = = =</b>\n”;$output = shell_exec( $cmd );echo $output;echo “\n\n”;?>
จาก PHP Code จะเห็นได้ว่า เราสามารถใช้คำสั่ง Execute แบบไหนก็ได้ขึ้นอยู่กับสถานการณ์และความถนัดของเรา
Optional 1
echo “<b>= = = = Optional 1 = = = =</b>\n”;system( $cmd );
ผลลัพธ์
Prologwas calledfrom PHPsuccessfully.
เป็นคำที่จะแสดงผลลัพธ์ออกมาทั้งหมดไม่ว่าจะเป็น Line ไหนก็ตาม แต่พอเราทดลองเก็บค่าที่ได้จาก system( $cmd ) เข้าตัวแปรด้วยคำสั่ง
$data = system( $cmd );echo $data; // successfully.
ผลลัพธ์
successfully.
จะพบว่ามันจะแสดงข้อความแค่บรรทัดสุดท้ายออกมาเท่านั้น
Optional 2
echo “<b>= = = = Optional 2 = = = =</b>\n”;$output = exec( $cmd );echo $output;
ผลลัพธ์
successfully.
จะเห็นว่าคำสั่งนี้จะแสดงข้อความแค่บรรทัดสุดท้ายออกมาเท่านั้น
Optional 3
echo “<b>= = = = Optional 3 = = = =</b>\n”;exec( $cmd, $output );print_r( $output );
ผลลัพธ์
Array( [0] => Prolog [1] => was called [2] => from PHP [3] => successfully.)
จะเห็นว่าคำสั่งนี้จะแสดงข้อความออกมาในรูปแบบของ Array นั่นหมายความว่าในแต่ละ Index นั้นคือแต่ละบรรทัดที่ถูก write(). ออกมานั้นเอง ซึ่งจะเห็นได้ว่ารูปแบบนี้เราสามารถเอาไปใช้ประโยชน์ได้สะดวกมากขึ้น
Optional 4
echo “<b>= = = = Optional 4 = = = =</b>\n”;$output = shell_exec( $cmd );echo $output;
ผลลัพธ์
Prologwas calledfrom PHPsuccessfully.
คำสั่งนี้จะเห็นได้ว่ามันจะเอาผลลัพธ์ทั้งหมดที่ได้มาทำเป็น string แล้วเอามาใส่ตัวแปรทั้งหมด