2012-02-18 38 views
3

我想實現在Eclipse中的Prolog一元程序,這裏是我寫的代碼的元編程 -錯誤而compling在序言

:- dynamic go/1. 
sol(true):- !. 
sol((A,B)):- !, sol(A), sol(B). 
sol(A):- clause(A, Body), sol(Body). 
go(X):- X is 5. 

現在,當我與sol(go(X)).查詢,我得到的錯誤accessing a procedure defined in another module in clause(X is 5, _292)並中止。我嘗試清除所有頂層模塊並重新打開ECLiPSe,然後運行,但仍然是同樣的錯誤。

可能是什麼原因?

謝謝!

回答

3

謂詞p/1正在使用內置謂詞(is)/2。請注意,X is 5是一種在句法上更方便的書寫方式is(X,5)。但是你的元解釋器只需要用戶定義的謂詞和控制結構(',')/2true/0。如果你想處理(is)/2你必須爲它引入一個單獨的條款。

sol(X is Y) :- !, X is Y. 

在ISO序言,目標predicate_property(Goal,built_in)可用於測試是否Goal是一個內置的謂詞。這適用於許多系統,如B,GNU,SICStus,SWI,XSB,YAP。所以你可以寫:

sol(Bip) :- predicate_property(Bip, built_in), !, Bip. 

在ECLiPSe這個內置不直接可用。你必須加載一個庫。建議使用庫swiquintus。由於某些(不清楚)原因,它不是ECLiPSe庫iso的一部分,但它是ISO。所以狀態

:- use_module(library(swi)). 

首先在您的文件(或在頂層)。

如果你想要一個元解釋器來覆蓋完整的Prolog語言,你將不得不明確地處理所有的控制構造。在這裏它們是 - 如標準中定義的(7.8控制結構)。

  1. true/0
  2. fail/0
  3. call/1
  4. !/0
  5. (',')/2
  6. (;)/2 - 脫節
  7. (->)/2
  8. (;)/2 - IF-THEN-ELSE
  9. catch/3
  10. throw/1

請注意,只有少數人可以通過直接調用的目標來處理。他們大多數必須明確處理!

+1

哦哇.. !!真棒解釋。非常感謝您的幫助。 :) – kallakafar 2012-03-10 11:12:14