Как GenAI трансформирует поле цифровой дидактики: различия между версиями

Материал из Поле цифровой дидактики
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
; Доклад в рамках секции «Актуальные вопросы развития методики обучения информатике, STEM-образования и робототехники»
; Доклад в рамках секции «Актуальные вопросы развития методики обучения информатике, STEM-образования и робототехники» (Дни науки МГПУ)
: 19.04.2023 17.00
: 19.04.2023 17.00
: Патаракин Е.Д., д.пед.наук, доцент, профессор ИЦО МГПУ
: Патаракин Е.Д., д.пед.наук, доцент, профессор ИЦО МГПУ
Строка 15: Строка 15:




=== Кейсы использования [[GenAI]] в STEM образовании ===
=== Кейсы использования [[GenAI]] в [[STEM]] образовании ===
 
 
 
 




Строка 245: Строка 241:


----
----
; [[ChatGTP]]:  
; [[ChatGPT]]:  
: Для решения данной задачи на Prolog можно использовать [[алгоритм Дейкстры]]. Вот пример кода
: Для решения данной задачи на [[Prolog]] можно использовать [[алгоритм Дейкстры]]. Вот пример кода


<syntaxhighlight lang="Prolog">  
<syntaxhighlight lang="Prolog">  

Текущая версия на 17:03, 19 апреля 2023

Доклад в рамках секции «Актуальные вопросы развития методики обучения информатике, STEM-образования и робототехники» (Дни науки МГПУ)
19.04.2023 17.00
Патаракин Е.Д., д.пед.наук, доцент, профессор ИЦО МГПУ
Didit didact2022.png WB Book fp.png


Вычислительная дидактика


Описание Область дидактики, рассматривающая новые дидактические отношения, когда обучающая машина учит другую обучаемую машину, когда обучающая машина учит человека или когда обучающий человек учит обучаемую программу или обучаемого агента.
Область знаний Информатика, Педагогика
Авторы Papert
Поясняющее видео
Близкие понятия Дидактика, Вычислительная наука
Среды и средства для освоения понятия Semantic MediaWiki, Snap!, Scratch


В процесс обучения, взаимодействия и построения знаний в современном мире вовлекаются не только люди, но и вычислительные машины. К привычным дидактическим отношениям, когда обучающий человек учит обучаемого человека, добавляются новые дидактические отношения, когда обучающая машина учит другую обучаемую машину, когда обучающая машина учит человека или когда обучающий человек учит обучаемую программу или обучаемого агента.

Человек Компьютерный агент
Человек Традиционный дизайн, когда обучающий человек учит обучаемого человека, дополненный возможностями вычислительной техники Конструкционизм, когда человек учится в процессе обучения программных агентов правилам поведения в цифровой среде.
Компьютерный агент Искусственные обучающие системы, когда компьютерная программа выступает в роли учителя для обучаемого человека. Метапрограммирование и машинное обучение, когда одна компьютерная программа обучает другую программу.

Литература

  1. Патаракин, Е.Д., 2023. Трансформация Вычислительной Дидактики Под Воздействием Генеративного Искусственного Интеллекта. БОЛЬШАЯ КОНФЕРЕНЦИЯ МГПУ сборник тезисов : в 3 т.. Том 1. Московский городской педагогический университет. Москва, 2023 Издательство: Издательство ПАРАДИГМА (Москва) 1, 14–17.
  2. Патаракин, Е.Д., 2022. Игровое поле вычислительной дидактики, in: Современная “цифровая” дидактика. Общество с ограниченной ответственностью “ГринПринт,” Москва, pp. 35–70.
  3. Patarakin, E., Burov, V., Yarmakhov, B., 2019. Computational Pedagogy: Thinking, Participation, Reflection, in: Väljataga, T., Laanpere, M. (Eds.), Digital Turn in Schools—Research, Policy, Practice, Lecture Notes in Educational Technology. Springer, Singapore, pp. 123–137. https://doi.org/10.1007/978-981-13-7361-9_9

Генеративный искусственный интеллект


Описание Генеративный искусственный интеллект — это метод машинного обучения, при котором нейросеть изучает массив данных и на основании этих данных создаёт собственный контент.
Область знаний Информатика, Физика, Химия, Образование, Искусственный интеллект
Авторы Weizenbaum, Goodfellow
Поясняющее видео https://www.youtube.com/watch?v=D5PqeC00PJU&t=1940s
Близкие понятия Искусственный интеллект
Среды и средства для освоения понятия ChatGPT, Snap!


Инструменты с использованием GenAI

Категория:DigitalTool

 DescriptionWebsite
ABM ConstructorКонструктор использования многоагентого моделирования - позволяет конструировать структуру учебных курсов из готовых блоков и включать в состав материалов многоагентные модели для экспериментов и дальнейшей модификации.http://digida.mgpu.ru/index.php?title=ABM Constructor
ArtbreederСредство генерации изображений 120px-Artbreeder_mixer.jpghttps://www.artbreeder.com/
AudionotesСредства перевода из голоса в текст и улучшения качества текста.https://audionotes.ai/en/
ChatGPTChatGPT — это прототип чат-бота с искусственным интеллектом, разработанный OpenAI и специализирующийся на диалогах. ChatGPT — большая языковая модель, отлаженная как с помощью методов обучения с учителем, так и с подкреплением. The acronym stands for Generative Pre-trained Transformer.https://chat.openai.com/chat
ConnectedpapersConnected Papers - это визуальный инструмент, помогающий исследователям и находить и изучать документы, относящиеся к их сфере деятельности. Пользователь может ввести название статьи или URL-адрес и получить график, показывающий ее контекст и релевантность. Это может помочь открыть новые направления исследований, сравнить разные подходы и следить за актуальными темами.https://www.connectedpapers.com/
CraiyonСредство для генерации изображений по заданному тексту.
  • 120px-Craiyon_cat.jpg
https://www.craiyon.com/
DreamAIСоздание изображений по описанию Трансформация готовых изображений под нужные параметры.https://dream.ai/create
Face generatorСоздание лиц несуществующих людей.
101px-Does-not-exist.png
https://this-person-does-not-exist.com/en
GigaChathttps://developers.sber.ru/portal/products/gigachat?attempt=1
Google ColabGoogle Colab — сервис, созданный Google, который предоставляет возможность работать с кодом на языке Python через Jupyter Notebook, не устанавливая на свой компьютер дополнительных программ.https://colab.research.google.com/
Google CollabGoogle Colaboratory — среда, чтобы писать код аналогично jupyter notebook.https://colab.research.google.com/
HumataПоддержка в написании текстов статей 60 страниц. Помощник берет готовый pdf документ и позволяет с ним работать, улучшать, дополнять, находить заимствованияhttps://www.humata.ai/
Hypotenuse AIПревращает несколько ключевых слов в оригинальные, проницательные статьи, описания продуктов и копию социальных сетей с помощью копирайтинга ИИ - всего за несколько минут.https://hypotenuse.ai/
Jamovihttps://www.jamovi.org/
JupyterJupyter — интерактивный блокнот, ориентированным на работу со множеством сред выполнения Python, но и R, Julia, Scala и ряда других.https://jupyter.org/about
Kandinsky 2.1Генеративная модель, создающая изображения по описанию.
  • 114px-Ru_dalle3.png
https://rudalle.ru/
LangChainLangChain – это инструмент, основанный на нейросетевых моделях, который способен анализировать естественный язык и автоматически формировать структурированные SQL-запросы. – это мощная платформа, помогающая разработчикам создавать комплексные приложения. используя языковые модели. Он предлагает набор инструментов, компонентов и интерфейсов, которые упрощают процесс создания приложений на основе больших языковых моделей (LLM) и моделей чата. LangChain позволяет легко управлять взаимодействием с языковыми моделями, объединять несколько компонентов и интегрировать дополнительные ресурсы, такие как API и базы данных.https://js.langchain.com/docs/
LogseqLogseq - это локальный структурный редактор (аутлайнер) с открытым исходным кодом, который работает с использованием локальных текстовых файлов Markdown и Org-mode. Подходит для базы знаний, организации мыслей, ведения списка дел. Распространёнными назначениями в использовании таких программ могут быть организация идей, задач, многоуровневые чек-листы и управление проектами.https://logseq.com/
Mc tutor botТелеграм-бот МГПУ, использующий возможности генеративного ИИ. 84px-Mcu_bot.pnghttps://t.me/mcu tutor bot
Merlin ChatGPT AppMerlin — это приложение ChatGPT для Chrome, позволяющее получить бесплатный доступ к чату GPT 4, обобщателю блогов и YouTube, автору ИИ для Gmail, Twitter и LinkedIn.
120px-Freir_papert_merlin_tranl.jpg
https://chrome.google.com/webstore/detail/chatgpt-app-for-chrome-me/camppjleccjaphfdbohjdohecfnoikec
MidjourneyMidjourney — программное обеспечение, создающее изображения по текстовым описаниямhttps://discord.com/invite/midjourney
NotionNotion — приложение для ведения, планирования рабочих и личных дел. Оно одно может заменить сразу несколько популярных инструментов, в том числе Evernote, Trello и Google Docs.https://www.notion.so/
OpenAI CodexOpenAI Codex — это модель искусственного интеллекта, разработанная OpenAI. Он анализирует естественный язык и генерирует код в ответ. Codex разработан на основе GPT-3, известной модели естественного языка от OpenAI. Инструмент обучен на миллиардах строк кода, а также письменного текста — именно это позволяет ему переводить человеческий язык в компьютерный.https://platform.openai.com/docs/guides/code
OraИнструмент для создания собственных ботов на основе chatGPT
  • 120px-Ora_AI.jpg
https://ora.ai/
PaperBrainСобирает статьи по тематике и помогает их читать - можно задавать вопросы по статье.https://www.paperbrain.study/
PapercupПеревод исходного видео на любой (30*) язык + профессиональная ИИ озвучка различными голосами.https://www.papercup.com/
PerplexityAIPerplexity — чат-бот с искусственным интеллектом для поиска информации и генерации текста. Perplexity использует информацию из современного интернета, а не образца 2021 года. Страница с ответом состоит из трёх блоков: сам ответ, источники информации, «вопросы по теме» и поле для дополнительных запросов.
  • 120px-Perplexity01.jpg
  • https://www.perplexity.ai/
    PoeПриложение с искусственным интеллектом Poe позволяет создавать собственных чат-ботов с помощью подсказок. Пользователь может переключаться между Sage, ChatGPT, GPT‑4, Claude Instant и Claude+. Платформа доступна через браузер.
  • 120px-Poe_python.jpg
  • https://poe.com/
    Roam researchХранение и организация заметок в виде огромного списка с перекрёстными ссылками. интеграция с ChatGPT позволяет делегировать задачи внутри - переформулируй текст, запиши краткое содержание статьи по ссылкеhttps://roamresearch.com/
    RytrНаписать статью в блог, рекламное сообщение, электронное письмо и много всего другого. Бесплатный план позволяет писать тексты длинной до 5000 в символов в месяц.https://rytr.me/
    Spin Rewriter 13Spin Rewriter - это одно из самых продвинутых средств рерайтинга. Это также один из лучших инструментов для создания статей с алгоритмом обработки естественного языка, который позволяет создавать высококачественные тексты, удобочитаемые и не содержащие плагиата.https://www.spinrewriter.com/free/june-sale
    TutorAIПользователь задаёт тему и система показывает учебные материалы по этой теме, разбитые на учебные модули.https://www.tutorai.me/
    WolframAlphaОбъединение выразительных возможностей языка Wolfram + ChatGPT.
    YandexGPTНейросеть Яндекса, доступна через голосовой помощник Алису и в окне браузера
  • 116px-YandexGPT_logo.jpg
  • https://ya.ru/
    Элиза (чат-бот)Eliza — первый чат-бот, разработанный в Массачусетском технологическом институте. Элиза (англ. ELIZA) — виртуальный собеседник, компьютерная программа Джозефа Вейценбаума, написанная им в 1966 году, которая пародирует диалог с психотерапевтом, реализуя технику активного слушания. Программа была названа в честь Элизы Дулитл, героини из пьесы «Пигмалион» Бернарда Шоу, которую обучали языку «язык Шекспира, Мильтона и Библии».

    Воздействие на поле вычислительной дидактики

    Какие статьи вики созданы с использованием GenAI?


    Классы объектов Воздействие GenAI
    Понятия Определение и пояснение понятий текстовыми GenAI
    Писатели
    Papert AI.jpg
    Языки программирования Появление обучающих языков, созданных GenAI - имитируемых GenAI. Например, имитация Boxer. Скрещивание с Wolfram
    Схемы и диаграммы Генерация диаграмм, математических, химических, фармакологических формул и схем
    Датасеты Выращивание и предобработка данных
    Цифровые средства
    Dream Instruments.jpg
    Обучающие средства и средства совместной деятельности, дополненные и усиленные GenAI
    Сетевые сообщества
    Commun Practice2.jpg
    Изменение UGC сообществ на сообщества, где создание пользовательского контента будет дополнено или замещено контентом GenAI
    Видео игры
    Learng Table game.jpg
    Сюжеты, элементы игровых и обучающих миров, обучающие видео игры полностью созданные GenAI
    Роботы и робототехника
    DreamRobots.jpg
    Алгоритмы для управление роботами будут создаваться GenAI
    Паттерны поведения агентов в цифровой среде Паттерны поведения, имитируемы в играх сохранятся
    Компетенции Появление перечня компетенций, необходимых для использования GenAI
    Руководства - рецепты Руководства по использованию GenAI для генерации контента
    Стандарты Появление образовательных стандартов, регламентирующих отношения учеников и GenAI


    Кейсы использования GenAI в STEM образовании

    Робототехника

    Приведи 50 примеров задач по робототехнике для щкольников
    1. Создание робота-манипулятора, который может поднимать и перемещать предметы.
    2. Разработка робота-пылесоса, который может автоматически убирать помещение.
    3. Создание робота-маяка, который может помочь в поиске людей в случае чрезвычайной ситуации.
    4. Разработка робота-помощника для людей с ограниченными возможностями.
    Предложи схему алгоритма для робота-геолога. Представь эту схему на языке graphviz
    digraph G {
     rankdir=TB;
    size="12,12";
     node [shape=rectangle];
     Start [label="Начало"];
     End [label="Конец"];
     node [shape=diamond];
     MineralCheck [label="Проверка наличия минералов"];
     node [shape=rectangle];
     MoveForward [label="Движение вперед"];
     CollectSample [label="Сбор образцов"];
     node [shape=diamond];
     BatteryCheck [label="Проверка заряда батареи"];
     node [shape=rectangle];
     RechargeBattery [label="Зарядка батареи"];
     node [shape=diamond];
     ObstacleCheck [label="Проверка наличия препятствий"];
     node [shape=rectangle];
     MoveAroundObstacle [label="Обход препятствия"];
     node [shape=diamond];
     EndOfAreaCheck [label="Проверка конца исследуемой области"];
     node [shape=rectangle];
     ReturnToStart [label="Возвращение на стартовую позицию"];
     Start -> MineralCheck;
     MineralCheck -> MoveForward [label="да"];
     MineralCheck -> End [label="нет"];
     MoveForward -> CollectSample;
     CollectSample -> BatteryCheck;
     BatteryCheck -> RechargeBattery [label="заряд 20%"];
     BatteryCheck -> ObstacleCheck [label="заряд >= 20%"];
     ObstacleCheck -> MoveAroundObstacle [label="есть препятствие"];
     ObstacleCheck -> EndOfAreaCheck [label="нет препятствия"];
     MoveAroundObstacle -> EndOfAreaCheck;
     EndOfAreaCheck -> ReturnToStart [label="да"];
     EndOfAreaCheck -> MoveForward [label="нет"];
    

    }



    Сделай такую же схему на языке Mermaid

    Предложи схему алгоритма для робота-геолога. Представь эту схему на языке mermaid

    ```mermaid
    graph TD
    A(Начало) --> B(Движение к точке)
    B --> C(Определение типа грунта)
    C --> D(Сбор образца грунта)
    D --> E(Анализ образца)
    E --> F(Принятие решения о продолжении работы)
    F --> G{Робот продолжает работу?}
    G -- Да --> B
    G -- Нет --> H(Завершение работы)
    ```
    


    Представьте алгоритм робота-геолога на языке Oberon

    Алгоритм робота-геолога на языке Oberon может выглядеть следующим образом:

    Импортировать необходимые библиотеки для работы с датчиками и двигателями робота.
     
    MODULE RobotGeologistIMPORT Math, Sensors, Motors;
    
    CONST
      MAX_DEPTH = 100; (* максимальная глубина, на которую может опуститься робот *)
      MAX_ANGLE = 45; (* максимальный угол, на который может повернуться робот *)
    
    VAR
      depth: INTEGER; (* текущая глубина *)
      angle: INTEGER; (* текущий угол *)
    
    PROCEDURE Main;
    VAR
      i: INTEGER;
    BEGIN
      (* инициализация датчиков и моторов *)
      Sensors.Init;
      Motors.Init;
    
      (* начальное положение робота *)
      depth := 0;
      angle := 0;
    
      (* цикл работы робота *)
      FOR i := 1 TO 10 DO
        (* опускаемся на случайную глубину *)
        depth := Math.Random(MAX_DEPTH);
        Motors.MoveDown(depth);
    
        (* поворачиваемся на случайный угол *)
        angle := Math.Random(MAX_ANGLE);
        IF Math.Random(2) = 0 THEN
          angle := -angle; (* случайно выбираем направление поворота *)
        END;
        Motors.Turn(angle);
    
        (* снимаем данные с датчиков *)
        Sensors.Read;
    
        (* обработка данных *)
        IF Sensors.IsObstacle THEN
          (* если обнаружено препятствие, то поворачиваемся на 180 градусов *)
          Motors.Turn(180);
        ELSIF Sensors.IsMineral THEN
          (* если обнаружена полезная руда, то поднимаемся на поверхность *)
          Motors.MoveUp(depth);
          EXIT; (* завершаем работу робота *)
        END;
    
        (* поднимаемся на ту же глубину *)
        Motors.MoveUp(depth);
      END;
    END Main;
    
    BEGIN
      Main;
    END RobotGeologist.
    

    Программирование

    Приведи примеры команд к породам черепах
    In NetLogo, you can create breeds to group similar agents together. Here are some commands for working with breeds:
    • breed [name] - Creates a new breed with the given name.
    • create-[name] [count] - Creates a specified number of agents of the given breed.
    • ask [breed] - Runs a command on all agents of the specified breed.
    • ask [breed] [command] - Runs a command on all agents of the specified breed.
    • ask [breed] with [condition] - Runs a command on all agents of the specified breed that meet the specified condition.
    • show [breed] - Displays a list of all agents of the specified breed in the Command Center.
    • count [breed] - Returns the number of agents of the specified breed currently in the model.
    • create-turtles [count] [set breed [name]] - Creates a specified number of turtles and assigns them to the specified breed.
    Приведи пример выбора решений на Scratch

    when green flag clicked forever if <touching color [#ff0000]> then say [I touched red!] else say [I didn't touch red.] end


    when green flag clicked
    forever
      if <touching color [#ff0000]> then
        say [I touched red!]
      else
        say [I didn't touch red.]
    end
    
    Код программы на Prolog, которая находит кратчайший путь в графе между двумя заданными вершинами.
    Poe - Вот пример кода Prolog, который может использоваться для поиска кратчайшего пути между двумя заданными вершинами графа:
     
    shortest_path(Start, End, Path) :-
      travel(Start, End, [Start], Q),
      reverse(Q, Path).
    
    travel(Start, End, Path, [End|Path]) :-
      connected(Start, End).
    travel(Start, End, Visited, Path) :-
      connected(Start, X),
      X \== End,
      \+member(X, Visited),
      travel(X, End, [X|Visited], Path).
    

    ChatGPT
    Для решения данной задачи на Prolog можно использовать алгоритм Дейкстры. Вот пример кода
     
    % Предикат для нахождения кратчайшего пути между двумя вершинами
    % Входные параметры: начальная вершина, конечная вершина, граф
    % Выходные параметры: кратчайший путь и его длина
    shortest_path(Start, End, Graph, Path, Length) :-
        % Инициализация списка расстояний до каждой вершины
        init_distances(Graph, Start, Distances),
        % Инициализация списка посещенных вершин
        init_visited(Graph, Visited),
        % Запуск алгоритма Дейкстры
        dijkstra(Graph, Start, End, Distances, Visited, [], Path, Length).
    
    % Предикат для инициализации списка расстояний до каждой вершины
    % Входные параметры: граф, начальная вершина
    % Выходные параметры: список расстояний до каждой вершины
    init_distances(Graph, Start, Distances) :-
     % Создание списка расстояний до каждой вершины
        findall(distance(Node, Inf), member(Node, Graph), Distances),
        % Установка расстояния до начальной вершины равным 0
        replace_distance(Start, 0, Distances, Distances).
    
    % Предикат для инициализации списка посещенных вершин
    % Входные параметры: граф
    % Выходные параметры: список посещенных вершин
    init_visited(Graph, Visited) :-
        % Создание списка посещенных вершин
        findall(visited(Node, false), member(Node, Graph), Visited).
    
    % Предикат для замены расстояния до вершины в списке расстояний
    % Входные параметры: вершина, новое расстояние, список расстояний, новый список расстояний
    replace_distance(Node, NewDistance, [distance(Node, _)|T], [distance(Node, NewDistance)|T]).
    replace_distance(Node, NewDistance, [H|T], [H|T1]) :-
        replace_distance(Node, NewDistance, T, T1).
    
    % Предикат для поиска вершины с минимальным расстоянием из списка расстояний
    % Входные параметры: список расстояний, список посещенных вершин, вершина с минимальным расстоянием
    % Выходные параметры: список расстояний, список посещенных вершин, вершина с минимальным расстоянием
    find_min_distance([], _, _) :- fail.
    find_min_distance([distance(Node, Distance)|T], Visited, MinNode) :-
        % Если вершина еще не посещена и ее расстояние меньше текущего минимального
        (member(visited(Node, false), Visited), Distance < MinDistance ->
            % Обновляем минимальное расстояние и вершину
            MinDistance = Distance, MinNode = Node;
            true),
        % Рекурсивный вызов для оставшихся вершин
        find_min_distance(T, Visited, MinNode).
    
    % Предикат для обновления списка расстояний до соседних вершин
    % Входные параметры: текущая вершина, список расстояний, список посещенных вершин, граф
    % Выходные параметры: новый список расстояний
    update_distances(Node, Distances, Visited, Graph, NewDistances) :-
        % Получаем список соседних вершин
        findall(Neighbor, member(edge(Node, Neighbor, _), Graph), Neighbors),
       % Обновляем расстояния до соседних вершин
        update_distances(Neighbors, Node, Distances, Visited, Graph, [], NewDistances).
    
    % Предикат для обновления списка расстояний до соседних вершин (рекурсивный вызов)
    % Входные параметры: список соседних вершин, текущая вершина, список расстояний, список посещенных вершин, граф,
    %                    новый список расстояний
    % Выходные параметры: новый список расстояний
    update_distances([], _, Distances, _, _, NewDistances, NewDistances).
    update_distances([Neighbor|T], Node, Distances, Visited, Graph, AccDistances, NewDistances) :-
        % Получаем расстояние до соседней вершины
        member(distance(Neighbor, Distance), Distances),
        % Получаем расстояние до текущей вершины
        member(distance(Node, CurrentDistance), Distances),
        % Получаем вес ребра между текущей и соседней вершинами
        member(edge(Node, Neighbor, Weight), Graph),
        % Если новое расстояние меньше текущего
        (NewDistance is CurrentDistance + Weight, NewDistance < Distance ->
            % Обновляем расстояние до соседней вершины
            replace_distance(Neighbor, NewDistance, Distances, NewDistances1),
            % Добавляем соседнюю вершину в список посещенных
            replace_visited(Neighbor, true, Visited, NewVisited),
            % Добавляем соседнюю вершину в список расстояний для обновления расстояний до ее соседей
            append(AccDistances, [distance(Neighbor, NewDistance)], AccDistances1);
            % Иначе оставляем все без изменений
            NewDistances1 = Distances, NewVisited = Visited, AccDistances1 = AccDistances),
        % Рекурсивный вызов для оставшихся соседних вершин
        update_distances(T, Node, NewDistances1, NewVisited, Graph, AccDistances1, NewDistances).
    
    % Предикат для замены посещенности вершины в списке посещенных вершин
    % Входные параметры: вершина, новое значение посещенности, список посещенных вершин, новый список посещенных вершин
    replace_visited(Node, NewVisited, [visited(Node, _)|T], [visited(Node, NewVisited)|T]).
    replace_visited(Node, NewVisited, [H|T], [H|T1]) :-
        replace_visited(Node, NewVisited, T, T1).
    
    % Предикат для запуска алгоритма Дейкстры
    % Входные параметры: граф, начальная вершина, конечная вершина, список расстояний, список посещенных вершин,
    %                    текущий путь, кратчайший путь, длина кратчайшего пути
    % Выходные параметры: кратчайший путь и его длина
    dijkstra(_, End, End, _, _, Path, Path, 0).
    dijkstra(Graph, Start, End, Distances, Visited, Path, ShortestPath, ShortestLength) :-
        % Находим вершину с минимальным расстоянием
        find_min_distance(Distances, Visited, Node),
        % Если все вершины посещены, то путь не найден
        (Node = End ->
            % Возвращаем кратчайший путь и его длину
            reverse(Path, ShortestPath), member(distance(End, ShortestLength), Distances);
            % Иначе обновляем список расстояний до соседних вершин и запускаем алгоритм Дейкстры рекурсивно
            update_distances(Node, Distances, Visited, Graph, NewDistances),
            replace_visited(Node, true, Visited, NewVisited),
            dijkstra(Graph, Start, End, NewDistances, NewVisited, [Node|Path], ShortestPath, ShortestLength)).