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.

Ответить