-
Notifications
You must be signed in to change notification settings - Fork 0
/
genetic_code.pl
63 lines (50 loc) · 1.64 KB
/
genetic_code.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
% -*- mode: prolog; -*-
:- module(genetic_code,
[ implements_code/2
, code_is_ambiguous/1
, code_is_unambiguous/1
, codebook_is_complete/1
, codebook_is_ambiguous/1
, codebook_is_unambiguous/1
]).
:- use_module(query).
% convert a codebook to its genetic code
% ------------------------------------------------------------------------------
aa_codons(AA, C_LIST2, BOOK) :-
setof(C, query([aa, c], [AA, C], BOOK), C_LIST1),
sort(C_LIST1, C_LIST2).
implements_code(BOOK, CODE2) :-
setof((AA, C_LIST),
aa_codons(AA, C_LIST, BOOK),
CODE1),
sort(CODE1, CODE2).
% code properties
% ------------------------------------------------------------------------------
code_is_ambiguous(CODE) :-
member((AA1, CODONS1), CODE),
member(C, CODONS1),
member((AA2, CODONS2), CODE),
member(C, CODONS2),
AA1 \= AA2.
code_is_unambiguous(CODE) :-
\+ code_is_ambiguous(CODE).
% codebook properties
% ------------------------------------------------------------------------------
% true if there exists at least one valid codon for every
% amino acid
codebook_is_complete_aa(BOOK) :-
forall(query([aa], [AA], BOOK),
query([aa, ac, c, trna], [AA, _, _, _], BOOK)).
% true if every codon codes for some amino-acid
codebook_is_complete_c(BOOK) :-
forall(query([c], [C], BOOK),
query([aa, ac, c, trna], [_, _, C, _], BOOK)).
codebook_is_complete(BOOK) :-
codebook_is_complete_aa(BOOK),
codebook_is_complete_c(BOOK).
codebook_is_ambiguous(BOOK) :-
implements_code(BOOK, CODE),
code_is_ambiguous(CODE).
codebook_is_unambiguous(BOOK) :-
implements_code(BOOK, CODE),
code_is_unambiguous(CODE).