Кажется, я всегда пытаюсь написать DCG для анализа входных файлов. Но, похоже, это должно быть просто? Есть ли советы или рекомендации, чтобы подумать об этой проблеме?Каков общий шаблон для создания dcg для ввода файла?
Для конкретного примера скажем, что я хочу проанализировать файл fasta. (https://en.wikipedia.org/wiki/FASTA_format). Я хочу прочитать каждое описание и каждую последовательность следов назад.
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- portray_text(true).
:- set_prolog_flag(double_quotes, codes).
:- set_prolog_flag(back_quotes,string).
fasta_file([]) -->[].
fasta_file([Section|Sections]) -->
fasta_section(Section),
fasta_file(Sections).
fasta_section(Section) -->
fasta_description(Description),
fasta_seq(Sequence),
{Section =.. [section,Description,Sequence]}.
fasta_description(Description) -->
">",
string(Description),
{no_gt(Description),
no_nl(Description)}.
fasta_seq([]) --> [].
fasta_seq(Seq) -->
nt([S]),
fasta_seq(Ss),
{S="X"->Seq =Ss;Seq=[S|Ss]}.
nt("A") --> "A".
nt("C") --> "C".
nt("G") --> "G".
nt("T") --> "T".
nt("X") --> "\n".
no_gt([]).
no_gt([E|Es]):-
dif([E],">"),
no_gt(Es).
no_nl([]).
no_nl([E|Es]):-
dif([E],"\n"),
no_nl(Es).
Теперь это явно неправильно. Поведение Я хотел бы это
?-phrase(fasta_section(S),">frog\nACGGGGTACG\n>duck\nACGTTAG").
S = section("frog","ACGGGGTACG");
S = section("duck","ACGTTAG");
false.
Но если бы я сделал phrase(fasta_file(Sections),">frog\nACGGGGTACG\n>duck\nACGTTAG).
разделы едина со списком разделов/2s, что то, что я хочу, но мой текущий код кажется вполне hacky-, как я обработал символ новой строки например.
Typo: 'S =" X "->' должен читать '[S] =" X "->' – false
[Этот ответ] (HTTP: // StackOverflow.com/a/12942551/772868) будет представлять для вас интерес. – false
Заменить '{Section = .. [section, Description, Sequence]}' by '{Section = section (Описание, последовательность)}' – false