<> (tally ?value (Bag ?list)) ((Bag tallying| tallying> ?value ?list)) <> (tallying> ?value ()) ( (tallying> ?value ((Entry ?value ?count) ?rest)) ( (tallying> ?value (?entry ?rest)) ((?entry tallying> ?value ?rest)) <> ((Bag tallying| ((?entry (tally all ()) () <> (tally all (?item ?rest) (Bag ?list)) (tally all ?rest tally ?item (Bag ?list)) <> (find ?value (Bag ?list)) ((Bag find| find> ?value ?list)) <> (find> ?value ((Entry ?value ?count) ?rest)) ( (find> ?value ()) ( (find> ?value (?entry ?rest)) ((?entry find> ?value ?rest)) <> ((Bag find| ((?entry (has all ()) (#yes) <> (has all (?item ?rest)) (?rest has all| find ?item) <> (?rest has all| #yes) (has all ?rest) <> (?rest has all| #no) (#no) <> (remove ?item (Bag ?rest)) ((Bag remove| remove> ?item ?rest)) <> (remove> ?item ()) ( (remove> ?item ((Entry ?item ?count) ?rest)) (removing ((Entry ?item @sub ?count 1) ?rest)) <> (remove> ?item (?entry ?rest)) ((?entry remove> ?item ?rest)) <> (removing ((Entry ?item 0) ?rest)) ( (removing ((Entry ?item ?count) ?rest)) ( ((Bag remove| ((?entry (remove all ()) () <> (remove all (?item ?rest) (Bag ?list)) (remove all ?rest remove ?item (Bag ?list)) <> (:) (takes>) <> (takes> >) (gives>) <> (gives> ;) ((Recipe () ())) <> (takes> ?item) (take ?item takes>) <> (gives> ?item) (give ?item gives>) <> (give ?item (Recipe ?needs ?gives)) ((Recipe ?needs (?item ?gives))) <> (take ?item (Recipe ?needs ?gives)) ((Recipe (?item ?needs) ?gives)) <> ((Recipe () ?gives)) () <> (recipes) (recipes>) <> (recipes> (Bag ?list)) ( (recipes> (Recipe ?needs ?gives)) ((Recipe ?needs ?gives) recipes>) <> ((Recipe ?needs ?gives) ( (bag {) (bag) <> (bag }) ((Bag ())) <> (bag ?item) (tally ?item bag) <> (rewrite (Recipe ?needs ?gives)) (rewrite| (Recipe ?needs ?gives) test> ?needs) <> (test> ?needs (Bag ?list)) (test| ?needs has all ?needs (Bag ?list)) <> (test> ?needs ?recipe) (?recipe test> ?needs) <> (test| ?needs #yes) (match| #yes remove all ?needs) <> (test| ?needs #no) ( (match| #yes (Bag ?list)) ( (rewrite| ?gives) <> (rewrite| ) <> (?recipe (update> ?gives (Bag ?list)) (update| tally all ?gives (Bag ?list)) <> (update> ?gives ?recipe) (?recipe update> ?gives) <> (update| (Bag ?list)) ( (rewrite| (?recipe (?recipe ( (rewrite (Bag ?list)) (done (Bag ?list)) <> (rewrite> ?recipe) (?recipe rewrite) <> (?recipe done) (done) recipes : > let's make a fruit cake! ; : flour sugar apples > apple-cake ; : fruit-salad apple-cake > fruit-cake ; : apples oranges cherries > fruit-salad ; bag { sugar oranges apples cherries flour apples }