Сравните классические паттерны проектирования (Strategy, Observer, Singleton, Factory) с эквивалентными приёмами в функциональном (Haskell) и логическом (Prolog) подходах: приведите пример реализации одного паттерна в Java, в Haskell и в Prolog, обсудите ограничения и преимущества каждого варианта и влияние парадигмы на тестируемость и сопровождение