我想構建一個機制,它根據導入到prolog中的txt文件構建不同的事實, 。我已經找到了一些直接聲明從文件中讀取的行的例子,但是我必須在斷言發生之前轉換數據。閱讀文件並在序言中構造事實
舉個例子:
man = {m1, m2}.
m1: w1 > w2.
應該讀作:
man(m1).
man(m2).
prefer(m1, w1, 1).
prefer(m1, w2, 2).
是否可以構建基於輸入的符號,這些事實?
我想構建一個機制,它根據導入到prolog中的txt文件構建不同的事實, 。我已經找到了一些直接聲明從文件中讀取的行的例子,但是我必須在斷言發生之前轉換數據。閱讀文件並在序言中構造事實
舉個例子:
man = {m1, m2}.
m1: w1 > w2.
應該讀作:
man(m1).
man(m2).
prefer(m1, w1, 1).
prefer(m1, w2, 2).
是否可以構建基於輸入的符號,這些事實?
感謝那個例子中所列數據的事實是有效的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)
當不確定時檢查優先順序。
是的 - 你需要做任何你想做的任何其他語言。
打開並讀取文件,解析內容,然後轉換爲您可以斷言的術語。
幸運的是,你在序言中,所以'解析內容'是語言在早餐中的一項任務。
事實證明,我一直在寫關於如何做這個確切的任務的教程。 這不是完全結束,但在網上
http://www.pathwayslms.com/swipltuts/dcg/
如果您的文件較大,請使用本教程中介紹的方法來閱讀。否則,只需將該文件轉換爲「代碼」樣式字符串並繼續使用即可。
可以請您給的是如何與做這個要點一個gdc?因爲經歷了你的教程,並沒有看到如何從文件中斷言新的規則。 –
增加另一個答案,評論區域不夠大 – Anniepoo
您可以通過{}
some_nonterminal圍繞它做的DCG任何 '正常' 的序言 - > 「冰箱」, 空白, [X], { %你可以把任何正常Prolog代碼在這裏 assert(fridge_named(X)) }。
這看起來像
冰箱摹
序列,並斷言fridge_named(0X47)數據庫(ASCII G爲0X47)
但我想要的是添加一個原子到數據庫,所以當我有: some_nonterminal - >「冰箱」,空白,原子(X), {assert(fridge_named(X))}。 沒有添加...怎麼回事? –
顯示完整的示例。我懷疑你沒有定義空白,或者沒有正確地調用短語或其他東西。你也可以在{}中寫一個writeln來證明你到達那裏 – Anniepoo
我想要的是將我的X綁定到一個原子而不是一個字符串。然後宣稱「冰箱的名字」是一個原子。 –
哎呀,我沒有密切關注 - 是的,CapelliC的權利,你可以用操作符定義完成。 – Anniepoo