2012-02-18 60 views
8

有沒有辦法在Lua做logic programming(想想Prolog)?Lua中的邏輯編程?

特別是:是否有邏輯編程的Lua模塊(miniKanren實現將是最好的,但它不是嚴格要求)?因爲我找不到任何[1]。如果沒有,是否有任何已知的(最好嘗試過)如何在Lua中進行邏輯編程?

另外:有沒有人試圖在Lua中做類似邏輯編程的事情?


[1]到目前爲止,我只找到blog post提寫一個在Metalua的可能性,但我寧願看到一個與標準的Lua兼容。

+1

是不是所有的編程邏輯?對於不熟悉邏輯編程的人員,您可能會做一些說明。我相信你可以使用metatables來製作一些東西。 – jpjacobs 2012-02-18 15:09:09

+0

好吧,我在邏輯編程中加入了一些提示......你知道,我可以嘗試像使用metatables一樣的東西,但起初我想知道其他人是否曾嘗試在我之前做過這樣的事情...... – mnicky 2012-02-19 15:01:07

+0

第二次在谷歌搜索'Lua'邏輯編程「庫」時,會給你一個關於Lua中多個範式編程的pdf,其中第5部分對prolog有一些參考。雖然不是一個完整的庫(似乎沒有一個),它可能會給你一些指示。 – jpjacobs 2012-02-19 18:05:30

回答

-1

邏輯編程是一個範例,因此它只是一種特定語法的形式,您可以在這些事實的邏輯方程中陳述一些事實和基礎結果,而事實本身可能是其他方程的結果。

Lua是沒有專門爲此設計的,但你可以很容易地通過定義所有邏輯編程運營商功能模擬這種行爲 - 即function and(...),將返回true只有當其所有參數屬實等,並使你的定義「事實「作爲由metatable提供的懶惰評估表。

1

有在Lua正向鏈推理引擎稱爲lua-faces。除MiniKanRen外,還有several other logic programming systems in JavaScript可以使用Castl自動翻譯成Lua。

我也wrote a translator將Lua的一個子集轉換成Prolog。鑑於此輸入:

function print_each(The_list) 
    for _, Item in pairs(The_list) do 
     print(Item) 
    end 
end 

它將在序言產生這樣的輸出:

print_each(The_list) :- 
    forall(member(Item,The_list),(

     writeln(Item) 
    )).