TRS Chapter #05 Examples in Oz %%%%%%%%%%%%%%%%%%%%%%%%%%% From CTM Chapter 9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Lazy problem solving (Solve) % This is the Solve operation, which returns a lazy list of solutions % to a relational program. The list is ordered according to a % depth-first traversal. Solve is written using the computation space % operations of the Space module. fun {Solve Script} {SolStep {Space.new Script} nil} end fun {SolStep S Rest} case {Space.ask S} of failed then Rest [] succeeded then {Space.merge S}|Rest [] alternatives(N) then {SolLoop S 1 N Rest} end end fun lazy {SolLoop S I N Rest} if I>N then Rest elseif I==N then {Space.commit S I} {SolStep S Rest} else Right C in Right={SolLoop S I+1 N Rest} C={Space.clone S} {Space.commit C I} {SolStep C Right} end end fun {SolveOne F} L = {Solve F} in if L==nil then nil else [L.1] end end fun {SolveAll F} L = {Solve F} proc {TouchAll L} if L==nil then skip else {TouchAll L.2} end end in {TouchAll L} L end fun {SolveN N F} L = {Solve F} in {List.take L N} end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5.2 fun {AppendTRS L S} case L of nil then S [] H|T then H|{AppendTRS T S} else fail end end {Browse 2#{AppendTRS [a b c] [d e]}} % 5.3 {Browse 3#{AppendTRS [a b c] nil}} % 5.4 {Browse 4#{AppendTRS nil [d e]}} % 5.5 try _ = {AppendTRS a [d e]} catch _ then skip end % 5.6 {Browse 6#{AppendTRS [d e] a}} % 5.9 fun {Appendo L S Out} choice S = Out L = nil [] H T Res in L = H|T _ = {Appendo T S Res} H|Res = Out end end % 5.10 {Browse 10# {SolveAll fun {$} X in {Appendo [cake] [tastes yummy] X} end}} % 5.11 {Browse 11# {SolveAll fun {$} X Y in {Appendo [cake with ice Y] [tastes yummy] X} end}} % 5.12 {Browse 12# {SolveAll fun {$} X Y in {Appendo [cake with ice cream] Y X} end}} % 5.13 {Browse 13# {SolveOne fun {$} X Y in {Appendo cake|with|ice|cream|Y [d t] X} end}} % 5.14 {Browse 14# {SolveOne fun {$} X Y in _ = {Appendo cake|with|ice|cream|Y [d t] X} Y end}} % 5.16 {Browse 16# {SolveN 5 fun {$} X Y in {Appendo cake|with|ice|cream|Y [d t] X} end}} % 5.17 {Browse 17# {SolveN 5 fun {$} X Y in _ = {Appendo cake|with|ice|cream|Y [d t] X} Y end}} % 5.20 {Browse 20# {SolveN 5 fun {$} X Y in {Appendo cake|with|ice|Y [d t Y] X} end}} % 5.21 {Browse 21# {SolveAll fun {$} X Z in {Appendo [cake with ice cream] d|t|Z X} end}} % 5.23 {Browse 23# {SolveN 6 fun {$} X Y in _ = {Appendo X Y [cake with ice d t]} X end}} % 5.25 {Browse 25# {SolveN 6 fun {$} X Y in _ = {Appendo X Y [cake with ice d t]} Y end}} % 5.27 {Browse 27# {SolveN 6 fun {$} R X Y in _ = {Appendo X Y [cake with ice d t]} [X Y] = R end}} % 5.29 %% {Browse 29# % {SolveN 7 %% fun {$} R X Y in % _ = {Appendo X Y [cake with ice d t]} %% [X Y] = R % end}} % 5.31 fun {Appendo2 L S Out} choice S = Out L = nil [] H T Res in L = H|T H|Res = Out {Appendo2 T S Res} end end % 5.32 {Browse 32# {SolveN 7 fun {$} R X Y in _ = {Appendo2 X Y [cake with ice d t]} [X Y] = R end}} % 5.33 {Browse 33# {SolveN 7 fun {$} X Y Z in _ = {Appendo2 X Y Z} X end}} % 5.34 {Browse 34# {SolveN 7 fun {$} X Y Z in _ = {Appendo2 X Y Z} Y end}} % 5.36 {Browse 36# {SolveN 7 fun {$} X Y Z in _ = {Appendo2 X Y Z} Z end}} % 5.37 {Browse 37# {SolveN 7 fun {$} X Y Z in _ = {Appendo2 X Y Z} Z end}} % 5.38 fun {Swappendo L S Out} choice H T Res in L = H|T H|Res = Out {Swappendo T S Res} [] S = Out L = nil end end % 5.39 %% {Browse 39# % {SolveOne %% fun {$} X Y Z in % _ = {Swappendo X Y Z} %% Z % end}} % 5.41 fun {Unwrap X} case X of H|_ then {Unwrap X.1} else X end end {Browse 41#{Unwrap [[[[pizza]]]]}} % 5.42 {Browse 42#{Unwrap [[[[pizza pie] with]] extra cheese]}} % 5.45 fun {Unwrapo X Out} choice H in X = H|_ {Unwrapo H Out} [] X = Out end end % 5.46 {Browse 46#{SolveAll fun {$} X in {Unwrapo [[[pizza]]] X} end}} % 5.48 %%{Browse 48#{SolveOne fun {$} X in {Unwrapo X pizza} end}} % 5.49 %%{Browse 48#{SolveOne fun {$} X in {Unwrapo [[X]] pizza} end}} % 5.52 fun {Unwrapo2 X Out} choice X = Out [] H in X = H|_ {Unwrapo2 H Out} end end % 5.53 {Browse 53#{SolveN 5 fun {$} X in _ = {Unwrapo2 X pizza} X end}} % 5.54 {Browse 54#{SolveN 5 fun {$} X in _ = {Unwrapo2 X [[pizza]]} X end}} % 5.55 {Browse 55#{SolveN 5 fun {$} X in _ = {Unwrapo2 [[X]] pizza} X end}} % 5.58 fun {Flatten S} case S of nil then nil [] H|T then {AppendTRS {Flatten H} {Flatten T}} else [S] end end {Browse 58#{Flatten [[a b] c]}} % 5.59 fun {Flatteno S Out} choice S = nil nil = Out [] H T ResH ResT in S = H|T _ = {Flatteno H ResH} _ = {Flatteno T ResT} {Appendo ResH ResT Out} [] [S] = Out end end % 5.60 {Browse 60#{SolveOne fun {$} X in {Flatteno [[a b] c] X} end}} % 5.61 {Browse 61#{SolveOne fun {$} X in {Flatteno [a [b c]] X} end}} % 5.62 {Browse 62#{SolveAll fun {$} X in {Flatteno [a] X} end}} % 5.64 {Browse 64#{SolveAll fun {$} X in _ = {Flatteno [[a]] X} X end}} % 5.66 {Browse 66#{SolveAll fun {$} X in _ = {Flatteno [[[a]]] X} X end}} % 5.68 {Browse 68#{SolveAll fun {$} X in _ = {Flatteno [[a b] c] X} X end}} % 5.71 %%{Browse 71#{SolveAll fun {$} X in _ = {Flatteno X [a b c]} X end}} % 5.73 fun {Flattenrevo S Out} choice [S] = Out [] S = nil nil = Out [] H T ResH ResT in S = H|T _ = {Flattenrevo H ResH} _ = {Flattenrevo T ResT} {Appendo ResH ResT Out} end end % 5.75 {Browse 75#{SolveAll fun {$} X in _ = {Flattenrevo [[a b] c] X} X end}} % 5.76 {Browse 76#{Reverse {SolveAll fun {$} X in _ = {Flattenrevo [[a b] c] X} X end}}} % 5.77 {Browse 77#{SolveN 2 fun {$} X in _ = {Flattenrevo X [a b c]} X end}} % 5.79 %%{Browse 79#{SolveN 3 fun {$} X in _ = {Flattenrevo X [a b c]} X end}} % 5.80 {Browse 80#{Length {SolveAll fun {$} X in _ = {Flattenrevo [[[[a [[[b]]] c]]] d] X} X end}}} |