On Thu, 6 Apr 2023 at 15:01, Sergei M. Abramov abram_AT_botik.ru < refal@botik.ru> wrote:
> А еще в рефале есть сконки. Интересно, как зверушке зайдет такая функция? > > f { > = ; > s.1 e.2 = <f e.2> s.1 > (e.1) e.2 = <f e.2> (<f e.1>); > } > > Ну, там стандартные вопросы: чему равно <f <f e.x>> и т.п. > См. ниже результат. Видно, что скобки оно НЕ понимает. Занятно, что как выявилось еще в предыдущих экспериментах, оно по-разному понимает код рефала с точками и без точек (желтый запрос и зеленый ответ). Наверно, оно учило диалекты Рефала по разным учебникам с разными примерами. Андрей Дано следующее определение функции f на языке программирования Рефал: ``` f { = ; s.1 e.2 = <f e.2> s.1 (e.1) e.2 = <f e.2> (<f e.1>); } ``` Верно ли, что <f<f<e.x>> == e.x ? Для ответа на этот вопрос нужно выполнить несколько шагов вычисления функции f: 1. <f<fe.x>>> 2.ffe.x>>> 3. <ffe.x>>f <e.x>>> 4. <f <f <e.x>> <fe.x>> <> 5. <f <e.x>> <f <fe.x>>> 6. <f <e.x>>ffe.x>> <fe.x>>> 7. <f <e.x>>f <fe.x>> <f <e.x>> <> 8. <f <fe.x>>> 9. <f <fe.x>> <> 10. <fe.x>> Таким образом, мы получили <f<fe.x>> = <fe.x>>. Но это не равно e.x в общем случае. Например, если e.x = (1), тоfe.x>> = <f<(1)>> =f>> =>, тогда как e.x = (1). Дано следующее определение функции f на языке программирования Рефал: ``` f { = ; s1 e2 = <f e2> s1 (e1) e2 = <f e2> (<f e1>); } ``` Верно ли, что <f<f<ex>> == ex ? Для ответа на этот вопрос необходимо понимать, как работает функция f. Если на вход функции f подается пустой список (первое правило), то она просто возвращает этот список без изменений. Если на вход функции f подается список, состоящий из одного элемента (второе правило), то она рекурсивно вызывает себя для второго элемента списка и возвращает результат, который получается из второго элемента списка и результата рекурсивного вызова функции f для него, помещенных в новый список. Теперь рассмотрим выражениеf<fex>>. Сначала происходит вызов функции f для внутреннего выражения f<ex>. Согласно второму правилу функции f, результатом этого вызова будет список, состоящий из двух элементов: результата вызова функции f для ex и самого ex, помещенных в новый список. То есть получится список, эквивалентный выражению <f ex> ex. Теперь происходит вызов функции f для этого списка. Согласно второму правилу функции f, результатом этого вызова будет список, состоящий из двух элементов: результата вызова функции f для ex и списка, содержащего результат вызова функции f для ex и сам ex, помещенных в новый список. То есть получится список, эквивалентный выражению <f ex> (<f ex> ex). Таким образом,f<fex>> эквивалентно выражению <f ex> (<f ex> ex). Ответ на вопрос зависит от того, какое значение имеет ex. Если ex является пустым списком, тоf<fex>> будет эквивалентно пустому списку. Если ex является любым другим списком, то <f<f<ex>> не будет эквивалентно ex.