2013-05-01 73 views
0

我需要從那裏有事實的描述文件讀取,例如:閱讀文件,並建立在SWI-Prolog的事實

id: GO:0000008 
name: thioredoxin 

,我需要建立一個事實與它一樣的:"gene(0000008,thioredoxin)."

---增加--- 嗨,我一直在搜索信息,我發現DCG子句,顯然DCG解決了這個問題,但我沒有找到一個詳細的例子。

回答

1

這裏的樣本,使用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。

+0

是否有你有'Fact = .. [gene,A_DIGITS,A_NAME]'而不是將頭改爲'read_fact(gene(A_DIGITS,A_NAME))'的原因? – 2013-05-01 20:16:48

+0

我正在展示組裝事實的可能性,也許從文件中讀取仿函數 - 這裏不是這種情況。 – CapelliC 2013-05-01 20:19:59

+0

它的工作!謝謝! – Cristhiam 2013-05-02 23:53:42

0

您可以使用在Perl/Python的/ PHP或類似的一個非常小的腳本,修改格式爲您在Perl

我($ ID)= '' 喜歡

例如一個;

而(<>){

如果($ ID NE ''){

m/name:\s(\w+)$/; 

print "gene(id, $1).\n"; 

$id = ''; 

}

其他{

if(m/id:.*(\d+)/){ $id = $1; } 

}

}