Recursive Prolog predicate for reverse / palindrome

前端 未结 4 2115
北荒
北荒 2020-12-03 21:59
  1. Can I get a recursive Prolog predicate having two arguments, called reverse, which returns the inverse of a list:

    Sample query and expected result:

4条回答
  •  感动是毒
    2020-12-03 22:40

    Ad 1: It is impossible to define reverse/2 as a (directly edit thx to @repeat: tail) recursive predicate - unless you permit an auxiliary predicate.

    Ad 2:

    palindrome(X) :- reverse(X,X).
    

    But the easiest way is to define such predicates with DCGs:

    iseq([]) --> [].
    iseq([E|Es]) --> iseq(Es), [E].
    
    reverse(Xs, Ys) :-
       phrase(iseq(Xs), Ys).
    
    palindrome(Xs) :-
       phrase(palindrome, Xs).
    
    palindrome --> [].
    palindrome --> [E].
    palindrome --> [E], palindrome, [E].
    

提交回复
热议问题