gpt4 book ai didi

list - 如何交换序言列表中的三乘三元素?

转载 作者:行者123 更新时间:2023-12-04 22:17:53 25 4
gpt4 key购买 nike

我正在 Prolog 中进行练习,但被卡住了。
我需要将列表中的三个相邻项目与另外三个元素交换。

那是:

| ?- swap([c,g,g,a,t,t,g,c,a,a], X).

X = [a,t,t,c,g,g,g,c,a,a]
X = [g,c,a,a,t,t,c,g,g,a]
X = [c,g,g,g,c,a,a,t,t,a]
X = [c,a,a,a,t,t,g,c,g,g]
.
.
.

这是我到目前为止:
swap([H1, H2, H3, H4, H5, H6|T1], X) :-
X = [H4, H5, H6, H1, H2, H3|T1];
swap([H2, H3, H4, H5, H6|T1], X);
swap([H1, H2, H3, H4, H5|T1], X).

这个输出是:
| ?- swap([c,g,g,a,t,t,g,c,a,a], X).

X = [a, t, t, c, g, g, g, c, a, a] ;
X = [t, t, g, g, g, a, c, a, a] ;
X = [t, g, c, g, a, t, a, a] ;
X = [g, c, a, a, t, t, a] ;
X = [c, a, a, t, t, g] ;
X = [c, a, a, a, t, t] ;
X = [g, c, a, g, a, t, a] ;
X = [c, a, a, a, t, g] ;
X = [c, a, a, g, a, t] ;
X = [t, g, c, g, g, a, a, a] ;
X = [g, c, a, g, a, t, a] ;
X = [c, a, a, a, t, g] ;
X = [c, a, a, g, a, t] ;
X = [g, c, a, g, g, a, a] ;
X = [c, a, a, g, a, g] ;
X = [c, a, a, g, g, a] ;
X = [t, t, g, c, g, g, c, a, a] ;
X = [t, g, c, g, g, t, a, a] ;
X = [g, c, a, g, t, t, a] ;
X = [c, a, a, t, t, g] ;
X = [c, a, a, g, t, t] ;
X = [g, c, a, g, g, t, a] ;
X = [c, a, a, g, t, g] ;
X = [c, a, a, g, g, t] ;
X = [t, g, c, c, g, g, a, a] ;
X = [g, c, a, g, g, t, a] ;
X = [c, a, a, g, t, g] ;
X = [c, a, a, g, g, t] ;
X = [g, c, a, c, g, g, a] ;
X = [c, a, a, g, g, g] ;
X = [c, a, a, c, g, g] ;
false.

我唯一的问题是每次递归都会丢失列表的某些部分,我不知道如何将其放回原处。

最佳答案

您似乎对描述 RNA 序列感兴趣。三元组,这听起来很像反密码子。要使这些序列更具可读性,请使用:

:- set_prolog_flag(double_quotes, chars).

这允许您编写 "attac" 代替 [a,t,t,a,c] 。请参阅 this 如何获得紧凑的答案。

现在交换。最简单的方法是先勾勒出你想要的:
... Triple1 ... Triple2 ...  is the OldSequence

... Triple2 ... Triple1 ... is the NewSequence

其中 ... 对于两个序列都是相同的。所有这些都可以使用 DCG 轻松转换。
tripleswap(OldSequence, NewSequence) :-
dif(T1,T2),
phrase( ( seq(A), triple(T1), seq(B), triple(T2), seq(C) ), OldSequence),
phrase( ( seq(A), triple(T2), seq(B), triple(T1), seq(C) ), NewSequence).

seq([]) --> [].
seq([B|Bs]) --> [B], seq(Bs).

triple([A,B,C]) --> [A,B,C].

每当您不信任 DCG 定义时,只需使用 phrase/2 尝试一下。喜欢
?- phrase(triple(T1), Bs).
T1 = Bs, Bs = [_A,_B,_C].

非终端 triple//1 描述了 3 个元素(大概是核苷酸)的序列。
seq//1 是一个任意长的序列。

存在具有更好终止条件的解决方案,但它们的可读性较差,并且通常需要某些在一般情况下难以维持的假设。这是一个如此简单的改进:
samelength([], []).
samelength([_|Xs], [_|Ys]) :-
samelength(Xs, Ys).

并添加 samelength(OldSequence, NewSeqence) 作为第一个目标。现在,当 tripleswap/2 终止时, samelength/2 终止。所以参数之一应该是一个固定长度的列表。

另请注意,我认为 "cccccc" 没有交换。这就是我添加 dif(T1,T2) 的原因。
?- tripleswap("cggattgcaa", Bs).
Bs = "attcgggcaa"
; Bs = "ttgacggcaa"
; Bs = "tgcatcggaa"
; Bs = "gcaattcgga"
; Bs = "caaattgcgg"
; Bs = "cttgggacaa"
; Bs = "ctgctggaaa"
; Bs = "cgcattggaa"
; Bs = "ccaattggga"
; Bs = "cgtgcgataa"
; Bs = "cggcatgata"
; Bs = "cgcaatggat"
; Bs = "cgggcaatta"
; Bs = "cggcaagatt"
; Bs = "cggacaattg"
; false.

顺便说一句,自 1980 年代以来, s 就被用于分子生物学。从...开始

David B. Searls, Investigating the Linguistics of DNA with Definite Clause Grammars, NACLP 1989



以及同一作者以及当时罗斯·奥弗贝克(Ross Overbeek)的其他作品。所有这一切都发生在 Human Genome Project 的黎明。

关于list - 如何交换序言列表中的三乘三元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59997011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com