gpt4 book ai didi

prolog - 在Prolog DCG中,如何去除超通解?

转载 作者:行者123 更新时间:2023-12-02 00:05:33 24 4
gpt4 key购买 nike

我有一个包含序列的文本文件。例如:

GGGGGGGGAACCCCCCCCCCTTGGGGGGGGGGGGGGGGAACCCCCCCCCCTTGGGGGGGG

我编写了以下 DCG 来查找 AA 和 TT 之间的序列。

:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- portray_text(true).

process(Xs) :- phrase_from_file(find(Xs), 'string.txt').

anyseq([]) -->[].
anyseq([E|Es]) --> [E], anyseq(Es).

begin --> "AA".
end -->"TT".

find(Seq) -->
anyseq(_),begin,anyseq(Seq),end, anyseq(_).

我查询并得到:

?- process(Xs).
Xs = "CCCCCCCCCC" ;
Xs = "CCCCCCCCCCTTGGGGGGGGGGGGG...CCCCC" ;
Xs = "CCCCCCCCCC" ;
false.

但我不希望它找到第二个解决方案或类似的解决方案。仅是一对 AA 和 TT 之间的解决方案,而不是所有组合。我有一种感觉,我可以在 dcg basiccs 库中使用 string_withoutstring,但我不明白如何使用它们。

最佳答案

您的anyseq//1与库(dcg/basics)中的string//1相同,并且具有相同的“问题”。

为了保持控制,我会引入“分隔符之间”状态:

elem(E) --> begin, string(E), end, !.

begin --> "AA".
end -->"TT".

find(Seq) -->
anyseq(_),elem(Seq).

anyseq([]) -->[].
anyseq([E|Es]) --> [E], anyseq(Es).

process(Xs) :-
phrase(find(Xs), `GGGGGGGGAACCCCCCCCCCTTGGGGGGGGGGGGGGGGAACCCCC+++CCCCCTTGGGGGGGG`,_).

现在我明白了

?- process(X).
X = "CCCCCCCCCC" ;
X = "CCCCC+++CCCCC" ;
false.

注意匿名变量作为phrase/3的最后一个参数:它需要适应由更严格的模式引起的“控制流”的变化:elem//1not后跟anyseq//1,因为任何两个序列“共享”anyseq//1 都会出现问题。

最后,您应该更改语法以使用正确的递归语法收集 elem//1....

关于prolog - 在Prolog DCG中,如何去除超通解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31247400/

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