Pull to refresh

Comments 11

А почему не F#? Мне кажется, он бы лучше подошел для решения это задачи и тоже .NET.
Всем и так понятно, что на F# это сделать так же легко, как и на прологе. По-моему, цель статьи — именно показать, что и C# им не уступит, вопреки распространенному мнению.
Ну понятно, что благодаря библиотекам, LINQ и прочему синтаксчическому сахару в C# можно сделать практически все, что угодно. В качестве теоретического эксперимента — занятно.
Это как раз не всегда понятно.
И да, это просто эксперимент, развлечение на досуге.
Мне не понятно. В F# есть встроенное средство для проверки доказательств / решения системы утверждений, или вы имеете в виду, что для него просто есть библиотека с удобным синтаксисом?
К сожалению, F# не знаю. Но, если приведете решение этой задачи на F#, будет любопытно посмотреть. Вообще, интересно смотреть решение одной и той же задачи на разных языках или даже одном языке, но разные подходы.
Вы сделали мне вызов и это хорошо, попытаюсь :)
После недолгого гугления я обнаружил следующее решение (по английски эта задача называется Zebra Puzzle): gist.github.com/henrik-ch/3751106
Пусть оно может и не такое красивое как у вас, однако тоже лаконичное.
По сути получается, что в шарпе с помощью библиотеки, реализующий основные пролог функции, программа, написанная на прологе, использующая основные функции, выглядит так же, как и в прологе? Ну допустим, но что из этого следует? На шарпе можно добиться того же результата? Да, конечно, это же тьюринг-полный язык, а как мы помним тезис тьюринга-черча, это значит что на нем мы можем посчитать что душе угодно. С тем же успехом можно взять ассемблер и брейнфак, можно даже с помощью макросов получить что-то похожее. Значит ли это, что этот язык подходит для реализации задачи? Не думаю.

Шарп замечательный язык, но тогда уж предоставляйте честное решение с имплементацией всех методов, без сторонних библиотек. Потому что если мы у языков заберем стандартные библиотеки, то останется только синтаксис, который в данном примере тоже проигрывает прологовскому, а по числу скобочек приближается к лиспу.

Но в любом случае, спасибо за статью. Я не согласен лишь в выводом, что если примотать кирпич к отвертке — то получится сносный молоток. Каждой задаче — свой инструмент. There is no silver bullet, Neo.
Так ведь библиотека и является инструментом. Который подходит для решения данной задачи. Я знаю C# и если вижу какую-то интересную задачу, то первым делом пытаюсь ее решить именно на этом языке. И я сделаю это гораздо быстрее и эффективнее, чем на более подходящем для этой задачи языке, но который я не знаю. Хотя специалист по тому языку, возможно, сделает на нем более эффективное решение. Зависит от цели — решить задачу или решить ее наиболее оптимально по какому-то критерию. Я даже числодробилки пишу на C#, хотя C для этого лучше подходит. Потому что это доставляет мне больше удовольствия, хотя код может получиться процентов на пятьдесят медленнее.
Есть хорошая поговорка: «Когда у тебя в руках молоток, все кажется гвоздями», или в оригинале:

image

Поэтому задача хорошего программиста — уметь пользоваться несколькими инструментами (или хотя бы хорошо знать об их существовании), чтобы выбрать нужный. И знать не в смысле «окей, я знаю, на С это выглядело бы примерно так», а знать в смысле понимать идеологию языка.

В моем случае изучение лиспа и F# позволило намного шире и эффективнее использовать лямбды в шарпе, а знание работы ассемблера и устройство памяти позволило писать cache-obvious алгоритмы, которые выполняются в разы быстрее просто от организации блочного прохода по массиву.
Sign up to leave a comment.

Articles