Pull to refresh

Comments 12

Замечательная демонстрация арифметики Чёрча.
Конечно, на умелых абстракциях, полученных Тьюрингом и Черчем основана сегодняшняя цивилизация… Но все таки, природа натуральных чисел волновала еще и Пифагора с Аристотелем.
А реализация натуральных чисел своими руками действительно имеет какое-то отношение к задаче?
Не, ну этож задачка для интервью, то есть в условиях ограничения по времени. Если кандидат за обычное время походя реализует еще и натуральные числа — он покажет свой уровень. Почему бы на интервью немного не похвастаться?
Спасибо, верное замечание )) Сколько в отрасли «недопонятых» формулировок, как часто реализуют системы несоответствующие требованиям, почему не удаётся воплощать грезы заказчиков, все плодятся паттерны, универсальные языки описаний, эМВэПэ и др… А тут демонстрация умения «абстрагироватся» — на нем и держится наш труд. В условии задачи используют «число делится на три», а это неявно подразумевало определенные ограничения, их поиск тут и представлен.
А свойство делимости не имеет никакого отношения к задаче?

Автор выделили вот такое свойство языка:
это система опирающаяся на логику предикатов и встроенные процедуры автоматического доказательства теорем

И доказал теорему «отображаемости» приведённого набора аксиом и правил на поставленную задачу.

Правда смысл доказательства большинство вряд ли поняли, это да…

Наверно автору стоило какие-то более жизненные и простые примеры давать, что бы заинтересовать тех, кто в доказательство теорем не умеет. Правда тогда пролог будет обычным языком программирования и к нему сразу начнутся претензии про «нет того, нет этого, а это вообще мне не нравится». Поэтому может и не надо упрощать.
Да, охота увидеть, что суть решения задачи в умении ее корректно формулировать. В этом пролог удобен.
По задаче нужно уметь «определить делимость натуральных чисел без остатка», в тексте приведена реализация умножения, можно бы было упростить так: «возможность умножить какое-то натуральне число на делитель и получить делимое», вот так:
?- mul( _, 0+1+1, 0+1+1+1+1).

такая цель подойдет, что бы узнать, что нет остатка от деления на 2 (0+1+1).
Попробую точнее, деление без остатка — это существование натурального множителя для делителя, при умножении на который получим натуральное делимое. Реализация из статьи так не вычислялась, вот иная формулировка:
add(0,X,X).
add(X+1,Y,Z+1):-add(X,Y,Z).

mul(0, _, 0).
mul(X+1, Y, Z):- add(Z1, Y, Z), mul(X, Y, Z1).

%кратность на 3
?- mul(_, 0+1+1+1, 0+1+1+1+1+1+1).
true.
%кратность на 2
?- mul(_, 0+1+1, 0+1+1+1+1+1+1).
true.
%и не кратность
?- mul(_, 0+1+1, 0+1+1+1+1+1).
false.
Это меня подтолкнуло на такую мысль: а может абстрагируемся еще больше, и отбросим арифметические операции этого "интэграл"

Не совсем так, числа в кодировке Черча это как раз один из вариантов реализации натуральных чисел, так что уровень абстракции тут ниже. Type class это просто требования к типу — функция опирающаяся на такое требование будет работать с любым типом, в том числе и с числами Черча (хотя конечно натуральные числа у`же чем целые, которые описывает Integral)

Спасибо, я могу ошибаться, совсем не углублялся в этот формализм, но форма записи напоминает знакомый Си++, где вместо указателя на базовый класс можно передать указатель на объект реализовавший наследника, а у него, ясно, все базовые операции должны присутствовать.
Я попробовал выделить, что абстрагируясь, погружаясь в суть корректных формулировок, есть возможность получать решения прямой и обратной задачи одновременно. Тут было сложение/вычитание, умножение/деление, которые выражаются единым правилом.
Представленное мной решение не «полно», оно не вычислит цель «для каких чисел на выходе будет fizz» или «для каких чисел на выходе будет fizzbuzz», вот так не сработает:
?- fizz_buzz(N, fizz).

Для уточнений формулировки потребуется новая статья, а Скала позволяет формализовать «обратную» и «прямую» задачу одним описанием?

Type class это не class, это класс типов — интересный вариант полиморфизма из функциональных языков когда протокол описывается отдельно от самого типа.


Что касается прямой и обратной задачи, prolog реализует поиск решения, описанного программой. Scala этого не делает — поиск нужно описать вместе с решением.

Ясно, в декларативной парадигме, меня увлекает возможность формулировать описание проблемы, которое и является ее решением, это же превращение условий задачи в абстрактные элементы, которые должны сложиться в ответ.
А реализовать прологом этот fizzbuzz в обе стороны возможно, надо покорректнее сформулировать описание.
Sign up to leave a comment.

Articles

Change theme settings