A solver in SWI Prolog: https://swish.swi-prolog.org/p/PlayWhittle_Solver.pl which you can run by querying in the lower right window:

    solve("brats herbs", Steps).
and seeing:

    Steps = ['rats herbs', 'rat herbs', 'rat hers', 'rat her', rather, rater, rate, ate, at, a, ''] ;
The core is this grammar:

    whittle(S0) --> [S1],                  % state S1 comes from
                    { select(_, S0, S1),   % removing a char from S0,
                      phrase(valid_state(_), S1) }, % S1 must be all words,
                      whittle(S1).         % and recurse.
    whittle([]) --> [].
which describes a solution as a list of successful state changes from input to empty string. Each change removes one character from the string and must leave a valid state after doing that. Prolog's implicit backtracking search means that when it tries "cat","at","t" the valid_state check fails because "t" is not in the wordlist, it backtracks to the previous state "cat","at" and retries, getting to "cat,"at","a","" and success.

So it's doing a depth-first search of the tree of all possible game states that come from removing each letter from each substring, only exploring each branch as deep as the first failure. It stops at the first success, but spacebar or 'next' will search for another solution. Find all 136 solutions by querying: findall(Steps, solve("brats herbs", Steps), Solutions).

It won't work in Scryer, it would need select/3 and the DCG helpers ported/included in the code, then changes to run on strings instead of character code lists. It would likely be more memory efficient then.