Showing posts with label prolog. Show all posts
Showing posts with label prolog. Show all posts

Sunday, February 01, 2004

The Prolog Interpreter

這學期加入 AI 助教群,我打算讓學弟妹從實作中瞭解 Unification Algorithm ,但又不想為他們帶來太大的負擔。從眾多 Prolog language 的 open source 中,我選出了 Peter Bouthoorn 所開發的版本,它原本就是被用於教學,可惜其程式架構實在稱不上漂亮。在無法坐視不理下,我一次一小步地 refactor 它,改了幾百個回合,並將其中好幾個關鍵的地方整個重寫,才有一個適用的 Prolog Interpreter 。這真是個不錯的練習。

接下來是將這個動過手術的 Prolog Interpreter 版本當中的 Unify, OccrCheck, and UnifyVar 等 functions 挖空,要學弟妹參照 AI 課本的 Unification Algorithm 後,為這些挖空的 functions 補上血肉。

考慮到修課的人數眾多,為了讓自己在批改作業時不會哭出來,必定得把這個作業批改的流程盡量自動化。

於是我就為學弟妹準備了一對 .txt 檔: input.txt 及對應的 output.txt 。為了怕有些學弟妹過份聰明地以 printf 將 desired output 直接印出,在批改作業時另外準備其他 input 及 desired output是一定要的。這部分我以 Unit Test 的工具來自動比對,只有在比對出錯才要告訴我出錯的地方在哪,否則它只要簡單打個點代表程式還活著,並在通過所有測試後吐出 OK 就好了。

為了更省事,我在 Windows XP 下裝了 MinGW with MSYS 來模擬 Linux 的 terminal ,並寫了一個 BASH 的 script 來將這一百餘份程式作業自動作執行、比對及歸類的動作。

Unit Test tool 在 Java 下有 JUnit 可以用,無奈這裡用於開發的程式語言是 C++ ,所以勢必要另外找一套對應的工具。我最先注意到的是其中最有名的,移植自 JUnit 的 CppUnit ,進一步瞭解後,發現它 Java 味太重了,感覺很不純,而顯得有點礙手礙腳(唉呀,我是不是太偏執了),於是我最後選擇使用專為 C++ 打造的 Unit++ 。嗯,這次用起來果然很順手 ^___^