反向/回文的递归Prolog谓词 [英] Recursive Prolog predicate for reverse / palindrome

查看:118
本文介绍了反向/回文的递归Prolog谓词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  1. 我能否获得一个具有两个参数的递归Prolog谓词,称为反向,该参数返回列表的反向:

  1. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆