反向/回文的递归Prolog谓词 [英] Recursive Prolog predicate for reverse / palindrome
问题描述
-
我能否获得一个具有两个参数的递归Prolog谓词,称为反向,该参数返回列表的反向:
Can I get a recursive Prolog predicate having two arguments, called reverse, which returns the inverse of a list:
示例查询和预期结果:
?- reverse([a,b,c], L).
L = [c,b,a].
具有两个称为palindrome
的参数的递归Prolog谓词,如果给定列表为回文,则返回true.
A recursive Prolog predicate of two arguments called palindrome
which returns true if the given list is palindrome.
示例查询具有预期结果:
Sample query with expected result:
?- palindrome([a,b,c]).
false.
?- palindrome([b,a,c,a,b]).
true.
推荐答案
没有一种有效的方法来使用单个递归定义来定义reverse/2
而不使用一些辅助谓词.但是,如果仍然允许这样做,则不依赖append/3
之类的内置方法(并且应适用于大多数Prolog实现)的简单解决方案将是使用累加器列表,如下:
There isn't an efficient way to define reverse/2
with a single recursive definition without using some auxiliary predicate. However, if this is nevertheless permitted, a simple solution which doesn't rely on any built-ins like append/3
(and should be applicable for most Prolog implementations) would be to use an accumulator list, as follows:
rev([],[]).
rev([X|Xs], R) :-
rev_acc(Xs, [X], R).
rev_acc([], R, R).
rev_acc([X|Xs], Acc, R) :-
rev_acc(Xs, [X|Acc], R).
rev/2
是逆向谓词,它简单地委托"到(或包装)基于累加器的版本rev-acc/2
,该版本将输入列表的元素以相反的顺序递归添加到累加器中.
rev/2
is the reversal predicate which simply 'delegates' to (or, wraps) the accumulator-based version called rev-acc/2
, which recursively adds elements of the input list into an accumulator in reverse order.
运行此:
?- rev([1,3,2,x,4],L).
L = [4, x, 2, 3, 1].
确实,@ false已经指出(+1),
And indeed as @false has already pointed out (+1),
palindrome(X) :- rev(X,X).
这篇关于反向/回文的递归Prolog谓词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!