Функции и процедуры - почти одно и то же. Различие лишь в том, что функция возвращает значение, а процедура - нет. Очевидно, функцию можно использовать, как процедуру, если просто игнорировать возвращаемое значение. Поэтому в других языках обычно даже не вводится такое понятие, как процедура. А в Си-подобных языках, где функция обязана иметь возвращаемый тип, используется тип void, что тоже как бы делает функцию процедурой.
Говоря о функциях или процедурах, акцент ставится на сам механизм вызова - указатель текущего места выполнения помещается в стек, управление передаётся функции, и по её завершении указатель восстанавливается из стека и выполнение программы продолжается с того же места. Таким образом, имеются в виду два момента: 1) сам вызов функции 2) расположение тела функции в другом месте памяти. То есть функция - по сути подпрограмма.
Оператор же - по сути отдельная самостоятельная инструкция. Обычно их можно менять местами на одном уровне вложенности, и это не добавит синтаксических ошибок. Однако сама по себе инструкция может быть не только простой, но и сложной, составной. Например, целый блок, или условный оператор, или цикл. Таким образом, оператор может содержать в себе другие операторы. Это надо понимать, чтобы не запутаться в терминологии. Говоря об операторах, акцент ставится на том, что код - это последовательность инструкций, которые выполняются одна за другой. Обращение к функции (её вызов) - это тоже оператор в том смысле, что это отдельная инструкция.