因此,我试图识别一个数字列表是否可以被识别为一个算术级数。例如,我有一个数字列表,[5, 10, 15, 20]
,我需要创建谓词,将其标识为算术级数。
发布于 2018-10-05 08:21:21
我们可以很好地找出两个不同的数字之间的区别:
diff_between( A, B, C):-
C is A - B.
至于列表,我们需要对连续的元素。
pairs( G3, [A | B], C):- % G3 is a goal expecting of 3 arguments
append( D, [_], [A | B]),
maplist( call(G3), B, D, C).
现在,我们可以得到连续元素之间的差异列表:
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 = [ ............. ]
然后我们只需要弄清楚它们是否都是一样的:
is_arith_prog( A ):-
consec_diffs( A, [B | C]),
maplist( =:=(B), C).
这个答案主要是有好奇心的。它可能会产生太多的作用。对任何事情进行编码的正确方法是,同时尽可能少地工作,并尽快得出结论。在本例中,它是通过直接的递归定义来完成的,该定义以自顶向下的方式处理列表。
发布于 2018-10-05 13:04:52
我会尝试给你一个框架,而不给出整个答案。底线是,您应该上网或获得一本教科书,学习Prolog递归列表处理。
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
。
https://stackoverflow.com/questions/52660298
复制相似问题