gpt4 book ai didi

prolog - 根据在事实内的列表中提供元素的查询检索整个事实

转载 作者:行者123 更新时间:2023-12-02 01:37:24 27 4
gpt4 key购买 nike

我在序言中有这个事实和规则->

amino(a,ala,alanine,[gca,gcc,gcg,gct]).
amino(b,asx,asparagine,[aac,aat]).
amino(c,cys,cysteine,[tgc,tgt]).

amino(A,B,C,[H|T]):-
amino(A,B,C,[H|T]),
amino(A,B,C,T).

我试图做的是搜索我试图从给定密码子(列表)中找到的氨基酸的名称、单字母代码和 3 字母代码。

当我查询时

?-amino(A,B,C,[tgc|_]).

它给

A = c
B = cys
C = cysteine

这很好,因为 tgc 是列表的头部。但是当我查询时

?-amino(A,B,C,[gct|_]).

它没有给出任何东西。我想做的是让 prolog 在事实列表中搜索密码子并打印出事实中的所有内容(其他密码子除外)所以我试图制定一个递归规则来从查询中检索整个事实在列表的尾部提供一个元素

最佳答案

如评论中所述,您在 amino 中有一个左递归案例。按照建议,您应该将 memberchk 与不同的谓词一起使用:

amino_codon([A,B,C],Codon) :-
amino(A,B,C,L),
memberchk(Codon,L).

(将结果包装在列表中是可选的)。

但是,您的方法的正确版本是:

amino_codon(A,B,C,L):- amino(A,B,C,L),!.
amino_codon(A,B,C,L):- amino_codon(A,B,C,[_|L]).

那样的话,要么你的查询与事实匹配,要么你试图找到与子列表 T 的匹配。

如果你真的只想有一个谓词,你可以这样做:

amino(a,ala,alanine,[gca,gcc,gcg,gct]):-!.
amino(b,asx,asparagine,[aac,aat]):-!.
amino(c,cys,cysteine,[tgc,tgt]):-!.

amino(A,B,C,T) :- amino(A,B,C,[_|T]).

添加了剪辑,因为您只对找到一个匹配项感兴趣。


编辑:抱歉,上面的条款有错误,现在更正。关于削减:如果我们不添加削减,则会发生以下情况。想象一下,在用上面的 4 个子句定义了 amino 之后,您正试图匹配 amino(A,B,C,[gcc|_]):

  1. 前 3 个子句失败。
  2. 第 4 个说:为了匹配 amino(A,B,C,[gcg|_]),让我们尝试找到一个子句,其中 amino(A,B,C ,L)匹配,使得L的尾部是T
  3. 第一个子句匹配,L[gca|T]T[gcc|_].
  4. 但是,您还有其他 3 个子句要尝试!您将回溯并尝试将 LT 与其他子句匹配,这将递归调用第 4 个子句,直到用尽所有可能的选择。您在这里没有多个解决方案,即使有,您也只对返回一个感兴趣。

如果您的谓词没有削减,则调用谓词必须调用一次(amino(...)),或者使用削减本身。请注意,将这种决定留给调用者而不是明确地添加无用的削减可能是可取的。

关于prolog - 根据在事实内的列表中提供元素的查询检索整个事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30477643/

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