%  Sample queries  for	pac-0.6.3  [2015/03/26]
%			pac-0.6.4   [2015/03/30]
%			pac-1.1.9	[2017/05/28] minor changes.
%
%  Queries in this document have been used to test the pac core
%	expand-pac.pl,
%	expand-word.pl, and
%	expand-etc.pl.
%
%  Newly added queries are related on the following form:
%
%  eval			---  eval on  term-completion based fuctional expressions
%  mrec, rec	---  a system of recursive PAC (nameless predicates)
%  let_w, let_wd, let_wl, let_wld,
%				---  hybrid regular expressions, steps in automata synthesis
%  let_sed		---  unix-sed like function in phrases.

		/*************
		*     eval    *
		*************/

% ?- module(pac).
% ?- call(pred([a]), X).
%@ X = a.
% ?- eval(1, R).
%@ R = 1.
% ?- eval([1,2], R).
%@ R = [1, 2].
% ?- eval("hello", R).
%@ R = "hello".
% ?- eval((X\X) @ 1, R).
%@ R = 1.
% ?- eval(append@[1,2]@[3,4], R).
%@ R = [1, 2, 3, 4].
% ?- eval(append@[a,b,c]@[1,2,3], X).
%@ X = [a, b, c, 1, 2, 3].
% ?- eval(([A,B]\ (([X,Y] \ append(X, Y)) @ A @ B)) @ [1,2] @ [a,b], R).
%@ R = [1, 2, a, b].
% ?- eval(([A,B]\ (([X,Y] \ :append(X, Y)) @ A @ B)) @ [1,2] @ [a,b], R).
%@ R = [1, 2, a, b].
% ?- eval((X\X)@(Y\Y), V).
%@ V = mpac:'pred#6'.
% ?- eval((X\X)@(Y\Y), V), call(V, hello, R).
%@ V = mpac:'pred#8',
%@ R = hello.
% ?- eval(pred([X, X]), R).  % <<<< intentional error
% ?- eval(pred([X, X])@3, R).
%@ R = 3.
% ?- eval(#(f) @ 1 @ 2, U).
%@ U = mpac:f(1, 2).
% ?- eval(#(pred([a, b])), R).
%@ R = mpac:'pred#12'.
% ?- eval(#((X\X) @ (Y\Y)) @ 3, U).
%@ U = mpac:'pred#14'(mpac:'pred#13', 3).
% ?- eval(#(f) @ #(Y\Y) @ 3, U).
%@ U = mpac:f(mpac:'pred#15', 3).
% ?- eval(#(X\X) @ (Y\Y) @ 3, U).
%@ U = mpac:'pred#17'(mpac:'pred#16', 3).
% ?- eval(#((X\X) @ (Y\Y)) @ 3, U).
%@ U = mpac:'pred#19'(mpac:'pred#18', 3).
% ?- eval(#(X\X)  @ 3, U), call(U, V).
%@ U = mpac:'pred#20'(3),
%@ V = 3.
% ?- eval(((X\X) @ (Y\Y)) @ 3, U).  % <<<<< error test
% ?- eval(#((X\X) @ (Y\Y)) @ 3, U).
%@ U = mpac:'pred#24'(mpac:'pred#23', 3).
% ?- eval(#((X\X) @ (Y\Y)) @ 3, U).
%@ U = mpac:'pred#36'(mpac:'pred#35', 3).
% ?- eval(#((X\X) @ #(Y\Y)) @ 3, U).
%@ U = mpac:'pred#34'(mpac:'pred#33', 3).
% ?- eval(#(X\X) @ #(Y\Y) @ 3, U).
%@ U = mpac:'pred#32'(mpac:'pred#31', 3).
% ?- eval(([X,Y] -> append(Y,X))@[1,2,3]@[a,b,c,d,e], R).
%@ R = [a, b, c, d, e, 1, 2, 3].
% ?- eval(maplist@ (fun([X,Y] -> quote(X-Y))) @ [1,2,3] @ [a,b,c], R).
%@ R = [1-a, 2-b, 3-c].
% ?- eval(maplist @ (X \ (append(X)@ append([a],[b]))) @ [[1,2],[3,4]], R).
%@ R = [[1, 2, a, b], [3, 4, a, b]].
% ?- eval(maplist@ fun([X]-> (append(X) @ append([a],[b])))@[[1,2],[3,4]], R).
%@ R = [[1, 2, a, b], [3, 4, a, b]].
% ?- eval( maplist@([X] \ (append(X)@ append([a],[b]))) @ [[1,2],[3,4]], R).
%@ R = [[1, 2, a, b], [3, 4, a, b]].
% ?- eval(maplist@ (X\((Y\[Y,Y])@X))@ numlist(1, 100), R).
%@ R = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8|...], [...|...]|...].
% ?- eval(maplist@ (X\ [X]) @ [a,b,c], R).
%@ R = [[a], [b], [c]].
% ?- eval(maplist@ pred([], [P-Q, Q-P])@[a-1,b-2], R).
%@ R = [1-a, 2-b].
% ?- eval((X\X)@[3,4], R).
%@ R = [3, 4].
% ?- eval(fun([X] -> X) @ (misc:set([3,4]+[5,6])), R).
%@ R = [3, 4, 5, 6] .
% ?- eval(fun([X] -> X) @ (misc:set([3,4]+[5,6])), R).
%@ R = [3, 4, 5, 6] .
% ?- eval((X\X)@ (misc:set([a,b]\[b,c])), R).
%@ R = [a] .
% ?- eval(flip([C, D]:- misc:set(pow(C), D))@ (misc:set(pow([1,2,3]))), R).
%@ C = [[3], [3, 1], [3, 2, 1], [3, 2], [2], [2, 1], [1], []],
%@ D = R, R = [[[]], [[], [3]], [[], [3, 1], [3]], [[], [3, 1]], [[], [3, 2|...], [3|...]], [[], [3|...], [...|...]|...], [[], [...|...]|...], [[]|...], [...|...]|...] .
% ?- eval(flip([A,B,C]:- C is A*B)@2@3, R).
% ?- eval(flip(([A,B,C]:- C0 is A*B, C is C0*C0))@2@3, R).
%@ A = 2,
%@ B = 3,
%@ C = R, R = 36,
%@ C0 = 6.


		/**************************************
		*     mrec(mutual recursion) / rec    *
		**************************************/

% ?- pac:expand_core(mrec([], [A = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(A, Y, Z, U)))]), user, G, P, []).
% ?- call(mrec([A = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(A, Y, Z, U)))]), [a,b],[c,d], R).
% ?- call(mrec([A = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(B, Y, Z, U))),  B = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(A, Y, Z, U)))]), [a
% ?- call(mrec([A = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(B, Y, Z, U))),  B = pred([[], X, X] & ([[X|Y],Z,[X|U]]:- call(A, Y, Z, U)))]), W, V, [a,b, c,d]).
% ?- call(mrec(H, [A = pred([[], X, [H|X]] & ([[X|Y],Z,[H, X|U]]:- call(B, Y, Z, U))),  B = pred([[], X, [H|X]] & ([[X|Y],Z,[H, X|U]]:- call(A, Y, Z, U)))]),[a], [b], R), H=hello.
% ?- call(mrec(H, [A = pred([[], X, [H|X]] & ([[X|Y],Z,[H, X|U]]:- call(B, Y, Z, U))),  B = pred([[], X, [H|X]] & ([[X|Y],Z,[H, X|U]]:- call(A, Y, Z, U)))]),[a,b], [c,d], R), H=hello.

% ?- call(rec(A, [], [[], X, X] & ([[X|Y],Z,[X|U]]:- call(A, Y, Z, U))), U, V, [a,b,c,d]).
% ?- let(Append, rec(A, [], [[], X, X] & ([[X|Y],Z,[X|U]]:- call(rec(B, [], [[], X, X] & ([[X|Y],Z,[X|U]]:- call(B, Y, Z, U))), Y, Z, U)))),  call(Append, U, V, [a,b,c,d]).
% ?- call(mrec([A = pred(G, [[], X, [G|X]] & ([[X|Y],Z,[G, X|U]]:- call(B, G, Y, Z, U))), B = pred(G, [[], X, [G|X]] & ([[X|Y],Z,[G, X|U]]:- call(A, G, Y, Z, U)))]), [a],[b], R), G = hello.


		/***************
		*     regex    *
		***************/

% ?- regex_am("a*********************************", R).
% ?- regex_am("a*b*c*", R).
% ?- regex_am("ab*", R).
% ?- regex_am(".", R).
% ?- regex_am(char(.), R).
% ?- regex_am(., R).
% ?- regex_am(*(.), R).
% ?- regex_am(".*", R).
% ?- regex_am("a*", R).
% ?- regex_am(+(.), R).
% ?- regex_am(+(a), R).
% ?- regex_am(*(+char(alnum)), R).


% ?- let(X, phrase(w("[^\\n]", A), `abc\n`)), call(X, R).

% ?- phrase(w("[^\\n]", A), `abc\n`, R).
% ?- phrase(w("[^\\n]*", A), `abc\n`, R).
% ?- phrase(w("[^\\n]*$", A), `abc\n`, R).
% ?- phrase(w("[^b]*c$", A), `aaaaaac`, R).
% ?- phrase(w("[^b]*$", A), `aaaaaa\n`, R).
% ?- phrase(w("[^b]*$", A), `aa\naa`, R).
% ?- x_char_boole_form($, X), iboole:i_boole(X, I).
% ?- am_special($, [1,2,3], E).
% ?- phrase(w(char(alnum) + *(char(alpha))), [a, '1', b,c], S).
% ?- phrase(w(char(alnum) + *(char(alpha))), `a1bc`, S).
% ?- phrase(w(ab+cd), `abcde`, S).
% ?- phrase(w("abcd"), `abcde`, S).
% ?- phrase(w(i(2)+i(3)), [2,3], S).
% ?- phrase(w(i(2)+i(3)), [2,3], S).
% ?- phrase(w(i(2)^(=<(3))), [2,2], S).
% ?- phrase(w(i(2)^(>=(3))), [2,2,2,2], S).

%%% regex to coalgebra.
%
% ?- regex_coalgebra("23", S).
% ?- regex_coalgebra(i(2)+i(3), S).
% ?- regex_coalgebra("[^\\./]*", X).
% ?- regex_coalgebra(( "\"([^\"\\\\]|(\\\\.))*\"" | "'([^'\\\\]|(\\\\.))*'" | "[^ \t\"']+"), X).
% ?- regex_coalgebra(*(a|b)+ [a]+(*([])) + (*(*([]|[]))), N).
% ?- regex_coalgebra(*(a|b)+ "a"+(*([]))+ (*(*([]|[]))), N).
% ?- regex_coalgebra(*(.), X).
% ?- regex_coalgebra(".*", X).
% ?- regex_coalgebra_char(".*", X).
% ?- regex_coalgebra_char("a*", X).
% ?- regex_coalgebra_code("a*", X).
% ?- regex_coalgebra(ab+cd, X).
% ?- regex_coalgebra_code(ab+cd, X).
% ?- regex_coalgebra_char("[adlz]", X).
% ?- regex_coalgebra(ab+cd, X, [code]).
% ?- regex_coalgebra_char(ab+cd, X).
% ?- regex_coalgebra_char(a, X).
% ?- regex_coalgebra_char(i([-1, -1]), X).
% ?- regex_coalgebra_char(a, X).
% ?- regex_coalgebra_char("a*", X), state_move([a], 1, S, X).
% ?- regex_coalgebra_char("a*", X), state_move([a,a,a], 1, S, X).
% ?- regex_coalgebra("a*", X, [char]), state_move([a,a], 1, S, X).
% ?- regex_coalgebra("\001\*", X, [code]).
% ?- regex_coalgebra(i([-1, -1]), X).

			/***************************
			*   map character classes  *
			***************************/
% ?- phrase(w(char(alnum) + *(char(alpha))), `a1bc`, S).
% ?- phrase(w(ab+cd), `abcde`, S).
% ?- phrase(w("abcd"), `abcde`, S).
% ?- map_coa_char_int(R, [1-[[97-97]-2], 2-[[]]]).


			/*********************
			*     goto states    *
			*********************/

%  ?- coa:am_char_dict([2-[[inf-sup]-3]], C, [], P).
%@ C = [2-[_G2137-3]],
%@ P = [[inf-sup]-_G2137].
% ?- split_goto([1-[[], [1,2,3]-s, [2,3]-t], 1-[[1,2,3]-s, [2,3]-t]], X).
%@ X = [1-[[], 1-s, 2-s, 3-s, 2-t, 3-t], 1-[1-s, 2-s, 3-s, 2-t, 3-t]] .

			/*****************************
			*     automaton synthesis    *
			*****************************/

%%  word_am(X:regex, Y:automata) is det
%
%   True if X is converted to Y.

% ?- coalgebra:show_am(".*").
% ?- coalgebra:show_am(@($)).
% ?- coalgebra:show_am(a).
% ?- coalgebra:show_am(a^(3-5)).
% ?- coalgebra:show_am(a^(>=(5))).
% ?- regex_coalgebra(a^(>=(1)), X).
% ?- regex_coalgebra(a^(>=(1)), X).
% ?- regex_am((.), R).
% ?- regex_word((special($) + a), Y, Z).
% ?- regex_coalgebra("(\000\|\001\)*", X, [code]), state_move([0,1,0,0], 1, S, X).
% ?- regex_coalgebra(i(-1), X,  [code]).
% ?- regex_coalgebra(i([-1, -2]), X,  [code]).
% ?- regex_coalgebra(*(i([-5 - -1])), X, [code]), state_move([-1, -2, -3], 1, S, X).
% ?- regex_coalgebra(i(-1) + *(i(0)) + i(-2), X, [code]), state_move([-1, -2], 1, S, X).
% ?- regex_coalgebra(i(-1) + *(i(0)) + i(-2), X, [code]), state_move([-1, 0,0, 0, 0, -2], 1, S, X).
% ?- am_codes([a,b], X).
% ?- am_codes([], X).
% ?- i_normal_class_form([-1, -2],  X).

			/******************************************
			*     automaton sysnthesis basic steps    *
			******************************************/

% ?- expand_power_state([x,y], [x-[a-2, b-3], y-[a-2, b-4, c-5]], R, A, []).
% ?- expand_power_state([x,y], [x-[[], a-2, b-3], y-[a-2, b-4, c-5]], R, A, []).
% ?- expand_power_state([x,y], [x-[special(s), a-2, b-3], y-[a-2, b-4, c-5]], R, A, []).
% ?- is_deterministic(coa([1-[a-1, b-1]], _)).
% ?- is_deterministic(coa([1-[a-1, a-1]], _)).
% ?- regex_coalgebra(".*****",  X).
% ?- am_minimum([2-[[], (inf-sup)-3], 3-[[], (inf-sup)-3]], 2, R).
% ?- am_minimum(coa([1-[a-2, b-1], 2-[a-1, b-2], 3-[a-3, b-1]],  1), D).
% ?- x_compare(C, x(2), 1-2).
% ?- coa:merge_pairs([a-2, a-3, a-2,  b-1, b-3, c-2], R, [], S, []).
% ?- coa:join_char_interval([], []).
% ?- coa:join_char_interval([(3-4)-t], R).
% ?- coa:join_char_interval([(inf-4)-t, (5-sup)-t], R).
% ?-join_char_interval([(10-sup)-t, (20-20)-s, (inf-4)-t], R).
% ?- coa:merge_target([a-1], R, []).
% ?- coa:merge_target([a-1, a-2], R, []).
% ?- coa:merge_target([a-1, a-2, b-3], R, []).
% ?- coa:merge_target([[], a-1, a-2, b-3], R, []).
% ?- coa:merge_target([[], a-1,  b-3, a-2], R).
% ?- union_find([a-b,x-y, x-x, y-z, b-c], [], R).
% ?- union_find([a-b,x-y, x-x, y-z, b-c], [], R).
% ?- coa:find_cluster(a, [[a,b],[c,d]], C, X).
% ?- am_flip([a-[b-c], d-[b-c], e-[b-c], x-[y-z]], R).
% ?- am_flip([a-[b-c], d-[b-c], e-[m-c], x-[y-z]], R).
% ?- am_flip([a-[[], b-c, d-e, e-c], x-[y-z]], R).
% ?- am_flip([a-[d-e, e-c], x-[y-z]], R).
% ?- am_flip([1-[a-1]], R).
% ?- am_flip([], X).
% ?- am_reverse(coa([1-[[]]], 1), R).
m% ?- am_reverse(coa([1-[a-2], 2-[b-3], 3-[[]]], 1), R).
% ?- power_state_closure([[1]], [1-[a-[1]]],  [], X).
% ?- power_state_closure([[1]], [1-[a-[2]], 2-[a-[1,2], b-[1]]], [], X).
% ?- merge_goto([1,2], [1-[a-[2,3]], 2-[a-[1,2], b-[3]]], [], X).
% ?- gdict_ord_merge([[], a-[1,2], c-[3]], [a-[2,3], b-[2]], R).
% ?- triples_to_coa([1-(a-4), 3-(c-3), 2-(b-1), 1-(a-2)], R).
% ?- coa:fiber_product_basic([a-[b,c]], [a-[1,2]], [], P).
% ?- coa:am_conflict_pairs([a-[[],1-a], b-[1-b]], S).
% ?- coa:am_conflict_pairs([a-[[],1-a], b-[1-b], c-[[],1-a]], S).
% ?- coa:am_conflict_pairs([a-[1-a], b-[1-b]], S).
% ?- coa:am_conflict_pairs([a-[[]], b-[[]]], S).
% ?- coa:fiber_product([a-[7,8,9], b-[1,2,3]], [a-[6,7,8], b-[1,2,3]],  P).
% ?- pairs_to_assoc([1-[], 1-2, 1-3, 2-3, 2-4], X, []).
% ?- coa:assoc_to_pairs([1-[2,3], 2-[3,4]], R, []).
% ?- coa:contract_merge([1,3,6], [2, 5, 7], R).
% ?- union([1,3,6], [2, 5, 7], R).
% ?- union([1,3,6], [2, 3,  5, 7], R).
% ?- coa:contract_insert(3, [2, 5, 7], R).
% ?- coa:final_states([1-[[],a-b], 2-[c-d]], R).
% ?- coa:arity_conflict_pairs([1-a, 2-b, 3-a, 4-b], A, []).
% ?- coa:s_product([1,2,3],[1,2,3], P).
% ?- coa:assoc_product([1,2,3], [1,2,3], R, []).
% ?- coa:assoc_subtract([1-[2,3,4], 2-[3,4], 3-[4,5,6]], [1-[3], 2-[4], 5-[6,7,8]], R).
% ?- coa:assoc_complement([1,2,3], [1-[2], 2-[3]], R).
% ?- coa:am_concat(coa([1-[[], a-2], 2-[[]]],1),  coa([1-[a-2], 2-[[]]],1), R).
% ?- coa:am_concat(coa([1-[[], a-1]],1),  coa([1-[[], b-1]],1), R).
% ?- coa:am_shift(3, coa([1-[a-2, b-3]],1), R).
% ?- coa:am_replace_null([a-2], 2-[[]], X).
% ?- coa:am_plus(coa([1-[a-2], 2-[[]]], 1), R).
% ?- coa:am_star(coa([1-[a-2], 2-[[]]], 1), R).
% ?- coa:am_star(coa([1-[a-2, b-3], 3-[[]], 2-[[]]], 1), R).
% ?- coa:am_star(coa([1-[a-2, a-3, b-3], 3-[[]], 2-[[]]], 1), R).
% ?- coa:am_star(coa([1-[a-2], 2-[[]]], 1), R).
% ?- coa:am_star(coa([1-[a-2, b-2], 2-[[]]], 1), R).
% ?- coa:am_plus(coa([1-[a-2, b-2], 2-[[]]], 1), R).
% ?- coa:am_copy(coa([1-[a-2], 2-[[]]], 1), D).
% ?- am_finals(coa([1-[[]], 2-[a-3], 3-[[]]], 1), R).
% ?- am_states(coa([1-[[]], 2-[a-3], 3-[[]]], 1), R).
% ?- coa:subst_coa([1-[b-2]], [1-9, 2-10], X).
% ?- coa:subst_coa([1-[[], b-2]], [1-9, 2-10], X).
% ?- coa:am_remove_useless_states(coa([1-[[], a-1, a-2], 2-[b-3], 3-[c-3]], 1), R).
% ?- coa:dg_path_find([], [1-[2], 2-[1]], [], X, Y).
% ?- coa:dg_path_find([1], [1-[2], 2-[1], 3-[1,2]], [], X, Y).
% ?- coa:am_connected_region(coa([1-[[]]], 1), C).
% ?- coa:am_connected_region(coa([1-[[], a-2], 2-[[]], 3-[a-3]], 1), C).
% ?- coa:am_connected_region(coa([1-[[], a-2], 2-[[]], 3-[a-3]], 1), C).
% ?- coa:am_remove_empty_states(coa([], 1), C).
% ?- coa:am_remove_empty_states(coa([1-[[],a-2], 2-[]], 1), C).
% ?- coa:am_remove_empty_states(coa([1-[[],a-2, a-3], 3-[b-2], 2-[]], 1),
% ?- coa:am_remove_states([1-[a-2,b-2]], [1,2], R).
% ?- coa:am_remove_states([1-[[],a-2,b-2], 2-[b-1]], [1], R).
% ?- cook_char_dict(0, 127, atom, Dict),  maplist(([X]:- writeq(X), nl),  Dict).
% ?- collect_chars(0, 10000, alpha, X).
% ?- compile_coa_state_one('nt#149', dot([97-97])-2, 0, user, _G3803, _G4943, [1-'nt#149', 2-'nt#150']).
% ?- compile_coa_state_one('nt#149', [97-97]-2, 0, user, _G3803, _G4943, [1-'nt#149', 2-'nt#150']).
% ?- compile_coa_rule([97-97], 0, a, b, user, P, []).
% ?- generate_code_test([1-1], V, C).
% ?- generate_code_test([1-1, 4-4], V, C).
% ?- generate_code_test([(1-4)\2], V, C).
% ?- adjacent_interval([1-2, 4-5, 7-9, 11-13], P, []).
% ?- adjacent_interval([1-2, 4-5, 7-9, 11-13, 15-17], P, []).
% ?- coalgebra:show_am("\\\\[a-zA-Z]*").
% ?- coalgebra:show_am("[a-zA-Z]*").

			/***************
			*     regex    *
			***************/

% ?- phrase((w(*(.), X), w(*(.), Y)),  [a,b,c], []).
% ?- phrase((wl(*(.), X), wl(*(.), Y)),  [a,b,c], []).
% ?- expand_w("a*$", [], G, P, []).
% ?- phrase(w("a*"), `aaaaab`, R).
% ?- expand_w("a*", A, [], [],  G, P, []).
% ?- regex_compare(C, "a", "a").
% ?- regex_compare(C, "a", "b").
% ?- regex_compare(C, "a*", "a").
% ?- regex_normal_am_list(["a", "b"], R).
% ?- regex_normal_am_list(["(ab)*", "b"], R).

		  /***************************
		  *     bisimilarity test    *
		  ***************************/

% ?- am_bisimilar(coa([], 0), coa([], 1)).
% ?- am_bisimilar(coa([1-[[]]], 1), coa([1-[[]]], 1)).
% ?- regex_am("a", R), am_bisimilar(R, R).
% ?- regex_am(a+ (+a), R), regex_am((+a)+a, S), !,  am_bisimilar(R, S).
% ?- regex_am(a+ (+a), R), regex_am((+a)+a+a, S), !,  am_bisimila

		  /*********************************
		  *     one-way similarity test    *
		  *********************************/

% ?- regex_am("a", A), regex_am("b", B), am_compare(C, A, B).
% ?- regex_am("a", A), regex_am("a", B), am_compare(C, A, B).
% ?- regex_am("a", A), regex_am("a*", B), word:am_compare(C, A, B).
% ?- word:regex_am("a*", A), word:regex_am("a", B), word:am_compare(C, A, B).

		/************************
		*     queries on sed    *
		************************/

% full sed in phrase is not yet finished, but already
% partially works well.

% ?- module(mpac).  %% <=== must
% ?- show(phrase(sed(w("a") >> pred([`x`])))).
% ?- show(phrase(sed(w(".+", A) >> pred(A, [[A,A]])), `ab`,  V)).
% ?- show_phrase(sed((w(".", A), w(".", B)) >> append(B, A))).
% ?- show_phrase(sed(w("a") >> pred([`x`]))).
% ?- show_phrase(sed(a/"a"/"b")).
% ?- show_phrase(w("a*")).

% ?- sed("a">>"b", `abcb`, R).
% ?- sed(w(".+", A) >> pred(A, [[A,A]]), `ab`,  V), smash(V).

% ?- phrase(sed(w(".+", A)>> pred(A, [[A,A]])), `ab`,  V), smash(V).
% ?- phrase(sed((w(".", A), w(".", B)) >> pred([A,B],([C]:- append(B, A, C)))), `abc`, R), smash(R).
% ?- phrase(sed((w(".", A), w(".", B)) >>append(B, A)), `abcdefghijklmn`,  V), smash(V).
% ?- phrase(sed(w("[afl]")>>pred([[]])), `abcdefghijklmn`,  V), smash(V).
% ?- phrase(sed(wl("\\\\[a-zA-Z]*")>>pred([[]])), `\\abcdefghijklmn`,  V), smash(V).
% ?- phrase(sed(w("a")>>pred([`x`])), `abaaa`,  V), smash(V).
% ?- phrase(sed( s/ "a" / "x"), `aaabbb`, R), smash(R).
% ?- phrase(sed(a/ "a" / "hello"), ` a a `, R), smash(R).
% ?- phrase(sed(wl/ "a" / "hello " / " world"), ` a a `, R), smash(R).
% ?- phrase((=), [a,b], X).

% ?- let_w(X, ".*"), phrase(X, `abc`, R).
% ?- let_wd(X, ".*"), call(X, A, [], `abc`, R).
% ?- let_wl(X, ".*"), phrase(X, `abc`, R).
% ?- let_wld(X, ".*"), call(X, A, [], `abc`, R).

% ?- module(mpac).
% ?- let_sed(X,  (w("a") >> =([]))), call(X, `abac`, S), smash(S, S0).
% ?- let_sed(X,  (w("a") >> =([]))), call(X, `abac`, S), smash(S).
% ?- let_sed(X,  ([A,B]^(w("a", A), w("b", B))>>append(B, A))), call(X, `abab`, S), smash(S).
% ?- let_sed(X,  ((w("a", A), w("b", B))>>append(B, A))), call(X, `abab`, S), smash(S).
% ?- let_sed(X,  (s/"a"/"x")), call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (b/"a"/"x")),		call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (a/ "a" / "x")),	call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (d/"a")),			call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (a/"a"/ "xxx")),	call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (d/"a")),			call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (w/"a"/"xxx"/"yyy")),	call(X, `abac`, S), smash(S).
% ?- let_sed(X,  (d/"a")),			call(X, `abac`, S), smash(S).

% ?- phrase(unix_sed(wl/("a", X)/"hello " / " world"), ` a a `, R), smash(R).
%                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  intentional error.