это если экшнов всего два. Я выше написал, что экшнов больше, причем чтобы не делать вообще все, из текущего мира выбирается список, какие имеет смысл делать.
я беру исходный мир, получаю список разных действий, которые "можно было бы сделать на первом шаге". Отсюда (монада список мне как раз это и позволяет делать) я делаю ветвление и получаю список действий, которые бы можно было сделать на втором шаге
если на первом доступны [a, b], то ветвление. На втором могут быть доступны [b, c] либо [a, b, d]. Из этого просто монадой список я бы получил 6 комбинаций, но поскольку я знаю о коммутативности действий (или точнее я опираюсь на равенство миров), то есть одна дублирующаяся пара и комбинаций остается только 5.
и наверно я все-таки соврал про то, что функции совсем полностью коммутируют. Это не всегда правда. А вот миры действительно могут совпадать в подавляющем большинстве случаев.
вообще, мне не очень интересны даже сами действия, мне нужно найти мир, который удовлетворяет некоторому условию "окончания". Действия в listActions подобраны так, что каждое из них заведомо приближает к окончанию (то есть бесконечных действий не будет).
раз каждое действие гарантированно приближает, то если бы можно было еще как-то непрерывно описать действия и как они приблажаются к результату, то звучит немного как задача машинного обучения (ну точнее в целом задача оптимизации функции), возмжоно генетических алгоритмов, но listActions все портит
ммхм. Ну вот собственно как, чуть упрощенный вариант. Внутри мира есть некий Map a Int. Условие завершения - все значения неотрицательны. Каждое действие увеличивает на какое-то число одно из полей, но уменьшает несколько других (циклов нет). Если бы для каждого поля было бы ровно одно доступное действие, то и ветвлений можно было бы избежать. Но для некоторых полей действий больше одного.