首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >号码表的prolog模式识别

号码表的prolog模式识别
EN

Stack Overflow用户
提问于 2018-10-05 07:20:09
回答 2查看 510关注 0票数 1

因此,我试图识别一个数字列表是否可以被识别为一个算术级数。例如,我有一个数字列表,[5, 10, 15, 20],我需要创建谓词,将其标识为算术级数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-05 08:21:21

我们可以很好地找出两个不同的数字之间的区别:

代码语言:javascript
运行
复制
diff_between( A, B, C):- 
    C is A - B.

至于列表,我们需要对连续的元素。

代码语言:javascript
运行
复制
pairs( G3, [A | B], C):-   % G3 is a goal expecting of 3 arguments
    append( D, [_], [A | B]),
    maplist( call(G3), B, D, C).

现在,我们可以得到连续元素之间的差异列表:

代码语言:javascript
运行
复制
consec_diffs( L, Diffs):-
    pairs( diff_between, L, Diffs).
 %  pairs( G3,         [A | B], C)
 %  maplist( call(diff_between), B, D, Diffs )

% consec_diffs( [a,b,c, ..., n,m], Diffs)
% =
%              [ b,c, ..., n,m ]
%              [ a,b, ....., n ]
%             ------------------- pairwise diff_between
%      Diffs = [ ............. ]

然后我们只需要弄清楚它们是否都是一样的:

代码语言:javascript
运行
复制
is_arith_prog( A ):-
    consec_diffs( A, [B | C]),
    maplist( =:=(B), C).

这个答案主要是有好奇心的。它可能会产生太多的作用。对任何事情进行编码的正确方法是,同时尽可能少地工作,并尽快得出结论。在本例中,它是通过直接的递归定义来完成的,该定义以自顶向下的方式处理列表。

票数 0
EN

Stack Overflow用户

发布于 2018-10-05 13:04:52

我会尝试给你一个框架,而不给出整个答案。底线是,您应该上网或获得一本教科书,学习Prolog递归列表处理。

代码语言:javascript
运行
复制
arith_prog([X,Y|T]) :-
    Diff #= X - Y,
    arith_prog([Y|T], Diff).

arith_prog([_], _). % A single element list is a degenerate arith prog
arith_prog([X,Y|T], Diff) :- ... (what goes here?)

请注意,这里使用的是CLP(FD) (因此,是#=/2操作符)。这是Prolog中使用整数进行推理的最佳方法,并提供了最通用的解决方案。如果希望将其限制为检查完全实例化的数字列表,则可以使用Diff is X - Y

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52660298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档