evaluate[HoldForm[op_[l_, r_]]] := op[evaluate[l], evaluate[r]]; evaluate[x_] := x; combine[l_, r_ /; evaluate[r] != 0] := {HoldForm[Plus[l, r]], HoldForm[Subtract[l, r]], HoldForm[Times[l, r]], HoldForm[Divide[l, r]] }; combine[l_, r_] := {HoldForm[Plus[l, r]], HoldForm[Subtract[l, r]], HoldForm[Times[l, r]]}; split[items_] := Table[{items[[1 ;; i]], items[[i + 1 ;; Length[items]]]}, {i, 1, Length[items] - 1}]; expressions[{x_}] := {x}; expressions[items_] := Flatten[Table[ Flatten[Table[ combine[l, r], {l, expressions[sp[[1]]]}, {r, expressions[sp[[2]]]}], 2], {sp, split[items]}]]; (* Must use all atoms in given order. *) solveMaintainOrder[goal_, items_] := Select[expressions[items], (evaluate[#] == goal) &]; (* Must use all atoms, but can permute them. *) solveCanPermute[goal_, items_] := Flatten[Table[ solveMaintainOrder[goal, pitems], {pitems, Permutations[items]}]]; (* Can use any subset of atoms. *) solveSubsets[goal_, items_] := Flatten[Table[ solveCanPermute[goal, is], {is, Subsets[items, {1, Length[items]}]}], 2]; (* Demonstration to find all the ways to create 1/5 from {2, 3, 4, 5}. *) solveMaintainOrder[1/5, Range[2, 5]] solveCanPermute[1/5, Range[2, 5]] solveSubsets[1/5, Range[2, 5]]