我需要從那裏有事實的描述文件讀取,例如:閱讀文件,並建立在SWI-Prolog的事實
id: GO:0000008
name: thioredoxin
,我需要建立一個事實與它一樣的:"gene(0000008,thioredoxin)."
---增加--- 嗨,我一直在搜索信息,我發現DCG子句,顯然DCG解決了這個問題,但我沒有找到一個詳細的例子。
我需要從那裏有事實的描述文件讀取,例如:閱讀文件,並建立在SWI-Prolog的事實
id: GO:0000008
name: thioredoxin
,我需要建立一個事實與它一樣的:"gene(0000008,thioredoxin)."
---增加--- 嗨,我一直在搜索信息,我發現DCG子句,顯然DCG解決了這個問題,但我沒有找到一個詳細的例子。
這裏的樣本,使用SWI-Prolog的助手庫
:- [library(dcg/basics)].
read_fact(Fact) -->
"id:", blanks, "GO:", string(DIGITS), "\n", "name:", blanks, string(NAME),
{atom_codes(A_DIGITS, DIGITS),
atom_codes(A_NAME, NAME),
Fact =.. [gene, A_DIGITS, A_NAME]
}.
產生
?- phrase(read_fact(F), "id: GO:0000008\nname: thioredoxin").
F = gene('0000008', thioredoxin) .
DCG都得心應手,以測試內聯字符串,如你所看到的,但對文件的工作有phrase_from_file ,從庫(pure_input)。此外,請瀏覽library(dcg/basics)以瞭解許多有用的'掃描儀',如空格// 0或字符串// 1。
您可以使用在Perl/Python的/ PHP或類似的一個非常小的腳本,修改格式爲您在Perl
我($ ID)= '' 喜歡
例如一個;
而(<>){
如果($ ID NE ''){
m/name:\s(\w+)$/;
print "gene(id, $1).\n";
$id = '';
}
其他{
if(m/id:.*(\d+)/){ $id = $1; }
}
}
是否有你有'Fact = .. [gene,A_DIGITS,A_NAME]'而不是將頭改爲'read_fact(gene(A_DIGITS,A_NAME))'的原因? – 2013-05-01 20:16:48
我正在展示組裝事實的可能性,也許從文件中讀取仿函數 - 這裏不是這種情況。 – CapelliC 2013-05-01 20:19:59
它的工作!謝謝! – Cristhiam 2013-05-02 23:53:42