小编Rez*_*itt的帖子

如何在不触发 Out of Local Stack 异常的情况下计算两个大字符串的每个字符的巧合?

我需要一个子句来计算两个大字符串之间的字符巧合但忽略'_'巧合。我有这个代码:

fit(GEN1, GEN2, N, N) :-
   length(GEN1, L1),
   length(GEN2, L2),
   0 is L1*L2.

fit([P1|R1], [P2|R2], N, TOTAL) :-
   member(P1, ['_',a,c,t,g]),
   member(P2, ['_',a,c,t,g]),
   append([P1],[P2],T),
   (  member(T,[[a,a],[c,c],[t,t],[g,g]])
   -> X is N+1
   ;  X is N
   ),
   fit(R1,R2,X,TOTAL).
Run Code Online (Sandbox Code Playgroud)

WhereGEN1GEN2are 包含所有字符大字符串的列表。

我尝试增加堆栈限制以避免Out of Local Stack异常,但收效甚微。

问题是,在深度递归子句中经常被调用。有没有更好的方法来做到这一点?

编辑

当一个或两个列表为空时,该子句需要停止。

编辑 2

值得一提的是,以下所有答案的测试都是使用 64 位序言完成的,该--stack-limit=32g选项是因为我的代码没有得到很好的优化,并且该fit子句是较大过程的一小部分,但它是我的代码的主要问题。

编辑 3

CapelliC 代码使用较少的资源工作。

使用library(reif)v2 的假代码工作得更快。

有关更多建议的解决方案,请参阅计算两个序列中匹配元素的复杂性library(aggregate)

stack-overflow optimization performance prolog

4
推荐指数
1
解决办法
139
查看次数