2012-12-23 18 views
1

我想構建一個機制,它根據導入到prolog中的txt文件構建不同的事實, 。我已經找到了一些直接聲明從文件中讀取的行的例子,但是我必須在斷言發生之前轉換數據。閱讀文件並在序言中構造事實

舉個例子:

man = {m1, m2}. 

m1: w1 > w2. 

應該讀作:

man(m1). 
man(m2). 
prefer(m1, w1, 1). 
prefer(m1, w2, 2). 

是否可以構建基於輸入的符號,這些事實?

回答

1

感謝那個例子中所列數據的事實是有效的Prolog的語法,該代碼會做

load_file_data(File) :- 
    open(File, read, Stream), 
    repeat, 
    read(Stream, Term), 
    ( Term = end_of_file 
    -> true 
    ; process(Term), 
     fail 
    ), 
    close(Stream). 

process(X = {L}) :- 
    forall(arg(_, L, A), (F =.. [X, A], assert(F))). 
process(X : A > B) :- 
    assert(prefer(X, A, 1)), 
    assert(prefer(X, B, 2)). 

注意,在m1: w1 > w2符的優先級是不是我們可以期待什麼,但它的作品,無論如何,謝謝完成模式匹配。使用

?- write_canonical(m1 : w1 > w2). 
>(:(m1,w1),w2) 

當不確定時檢查優先順序。

+0

哎呀,我沒有密切關注 - 是的,CapelliC的權利,你可以用操作符定義完成。 – Anniepoo

3

是的 - 你需要做任何你想做的任何其他語言。

打開並讀取文件,解析內容,然後轉換爲您可以斷言的術語。

幸運的是,你在序言中,所以'解析內容'是語言在早餐中的一項任務。

事實證明,我一直在寫關於如何做這個確切的任務的教程。 這不是完全結束,但在網上

http://www.pathwayslms.com/swipltuts/dcg/

如果您的文件較大,請使用本教程中介紹的方法來閱讀。否則,只需將該文件轉換爲「代碼」樣式字符串並繼續使用即可。

+0

可以請您給的是如何與做這個要點一個gdc?因爲經歷了你的教程,並沒有看到如何從文件中斷言新的規則。 –

+0

增加另一個答案,評論區域不夠大 – Anniepoo

0

您可以通過{}

some_nonterminal圍繞它做的DCG任何 '正常' 的序言 - > 「冰箱」, 空白, [X], { %你可以把任何正常Prolog代碼在這裏 assert(fridge_named(X)) }。

這看起來像

冰箱摹

序列,並斷言fridge_named(0X47)數據庫(ASCII G爲0X47)

+0

但我想要的是添加一個原子到數據庫,所以當我有: some_nonterminal - >「冰箱」,空白,原子(X), {assert(fridge_named(X))}。 沒有添加...怎麼回事? –

+0

顯示完整的示例。我懷疑你沒有定義空白,或者沒有正確地調用短語或其他東西。你也可以在{}中寫一個writeln來證明你到達那裏 – Anniepoo

+0

我想要的是將我的X綁定到一個原子而不是一個字符串。然後宣稱「冰箱的名字」是一個原子。 –