Skip to content

Instantly share code, notes, and snippets.

@GeoffChurch
Created March 6, 2022 03:37
Show Gist options
  • Select an option

  • Save GeoffChurch/1b89ae43814328554e82cc99bdc70c98 to your computer and use it in GitHub Desktop.

Select an option

Save GeoffChurch/1b89ae43814328554e82cc99bdc70c98 to your computer and use it in GitHub Desktop.
Nondeterministic pushdown automaton interpreter adapted from Art of Prolog 2e, Ch 17
accept(DCG, Xs) :-
call(DCG, initial, Q),
accept(DCG, Q, Xs, []).
accept(DCG, Q, [], []) :-
call(DCG, final, Q).
accept(DCG, Q, [X|Xs], S) :-
call(DCG, delta, Q, X, S, Q1, S1),
accept(DCG, Q1, Xs, S1).
palindrome(initial, pushin).
palindrome(final, pushin). % empty palindrome
palindrome(final, poppin).
palindrome(delta, pushin, _, S, poppin, S). % ignore middle character (odd-length palindrome)
palindrome(delta, pushin, X, S, poppin, [X|S]). % push last character of first half (even-length palindrome)
palindrome(delta, pushin, X, S, pushin, [X|S]). % keep pushin
palindrome(delta, poppin, X, [X|S], poppin, S). % pop
:- findnsols(6, Pal, accept(palindrome, Pal), Pals), maplist(writeln, Pals).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment