<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="ru">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">AUTOMATED PROBLEM CHECKING FOR FUNCTIONAL PROGRAMMING COURSE</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Michael</forename><surname>Simuni</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Санкт-Петербургскии государственныи университет</orgName>
								<address>
									<addrLine>г. Санкт-Петербург</addrLine>
									<country>Россия</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">JobToday SA</orgName>
								<address>
									<addrLine>г. Санкт-Петербург</addrLine>
									<settlement>Россия</settlement>
								</address>
							</affiliation>
							<affiliation key="aff2">
								<orgName type="institution">Петербургскии политехническии университет Петра Великого</orgName>
								<address>
									<addrLine>г. Санкт</addrLine>
									<settlement>-Петербург</settlement>
									<country>Россия</country>
								</address>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="institution">St.Petersburg State University</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">JobToday</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff5">
								<orgName type="department">Peter the Great St</orgName>
								<orgName type="institution">.Petersburg Polytechnic University</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Alexey</forename><surname>Soloviov</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Санкт-Петербургскии государственныи университет</orgName>
								<address>
									<addrLine>г. Санкт-Петербург</addrLine>
									<country>Россия</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">JobToday SA</orgName>
								<address>
									<addrLine>г. Санкт-Петербург</addrLine>
									<settlement>Россия</settlement>
								</address>
							</affiliation>
							<affiliation key="aff2">
								<orgName type="institution">Петербургскии политехническии университет Петра Великого</orgName>
								<address>
									<addrLine>г. Санкт</addrLine>
									<settlement>-Петербург</settlement>
									<country>Россия</country>
								</address>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="institution">St.Petersburg State University</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">JobToday</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
							<affiliation key="aff5">
								<orgName type="department">Peter the Great St</orgName>
								<orgName type="institution">.Petersburg Polytechnic University</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Vasiliy</forename><surname>Shaitan</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">JobToday SA</orgName>
								<address>
									<addrLine>г. Санкт-Петербург</addrLine>
									<settlement>Россия</settlement>
								</address>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">JobToday</orgName>
								<address>
									<settlement>St.Petersburg</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">AUTOMATED PROBLEM CHECKING FOR FUNCTIONAL PROGRAMMING COURSE</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">467425FE1E77BBA65C1EA9AE80B364B5</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T15:13+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Testing</term>
					<term>problem checking</term>
					<term>functional programming</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>АВТОМАТИЗИРОВАННАЯ ПРОВЕРКА ЗАДАЧ В КУРСЕ «ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ» * АННОТАЦИЯ В статье рассматривается система тестирования и проверки задач для курса «Функциональное программирование», читаемого на математико-механическом факультете СПбГУ. Обсуждаются основные возможности системы тестирования, средства автоматизированной проверки задач и основные возможности проектируемой версии системы.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="ru">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>В работе рассматриваются возможности автоматизации проверки задач для курса «Функциональное программирование» <ref type="bibr" target="#b0">[1]</ref>, читающемся на математико-механическом факультете СПбГУ. Последние четыре года при проведении курса используется система тестирования и учета решения задач <ref type="bibr" target="#b1">[2]</ref>. В результате внедрения этои системы заметно увеличилась активность студентов при решении задач, и, в то же время, заметно упростилась работа преподавателя. В 2016 году система была дополнена средствами автоматизированнои проверки задач. Это позволило преподавателю избавиться от части рутиннои работы и сосредоточиться на содержательнои работе со студентами. В то же время, первые результаты работы с новои версиеи системы показали необходимость ее усовершенствования. В настоящее время разрабатывается проект новои версии системы, позволяющеи сделать работу преподавателя более комфортнои . Перечислим кратко особенности рассматриваемого курса. Курс «Функциональное программирование» проводится на математико-механическом факультете СПбГУ для студентов 4 или 3 курс, в зависимости от специальности. Курс читается на основе языка Haskell <ref type="bibr">[3]</ref>. Для участников не предполагаются какие-либо знания в области функционального программирования, но предполагается достаточно хорошие навыки программирования вообще и общая математическая культура. Рассматриваются темы от основ функционального программирования (функции высшего порядка, алгебраические типы данных и т.д.) до достаточно сложных тем, таких, как продолжения (continuations), монады, «бесплатные теоремы» (theorems for free) и т.д.</p><p>Курс слушают примерно 70-80 человек. Проверка задач с помощью тестов используется в большинстве массовых онлаи н курсов (например, в курсе Stepic, подготовленным Д.Н.Москвиным <ref type="bibr" target="#b2">[4]</ref>). В отличие от таких курсов, в рассматриваемои системе автоматическое засчитывание задач, у которых прошли все тесты, не предусмотрено, они в любом случае просматриваются и засчитываются вручную. В следующеи версии предполагается реализовать автоматическое засчитывание задач с прои денными тестами, но не для всех, а только для задач, повышеннои сложности. Для такого автоматического засчитывания будет необходимо также обеспечить контроль списывания, он обсуждается ниже.</p><p>По сравнению с распространенными системами тестирования, реализованная подсистема тестирования обладает рядом особенностеи :</p><p>1. Студенту сообщается тестовый пример вызова, на котором его решение дало неправильные результаты. В большинстве систем тестирования <ref type="bibr" target="#b2">[4,</ref><ref type="bibr" target="#b3">5]</ref>   Автоматическое засчитывание типичных правильных решений. Одна из особенностеи простых задач, которые даются для закрепления материала в том, что у них, как правило, есть небольшое количество возможных правильных решении , и большинство студентов присылают одно из них.</p><p>Например, для закрепления темы «бесконечные списки» дается задача «Описать бесконечныи список <ref type="bibr" target="#b5">[7,</ref><ref type="bibr">77,</ref><ref type="bibr">777,</ref><ref type="bibr">7777</ref>,7777…]». Для этои задачи есть не так мало решении , которые приходят в голову студентам. Но есть примерно 3-4 наиболее типичных правильных решения, которые, в совокупности, присылают примерно 50% студентов. Из оставшихся студентов примерно 40% присылает тоже 4-5 типичных вариантов решения, но эти варианты не совсем правильные, для них требуется написать замечания.</p><p>Важнои особенностью, характернои , видимо, именно для функционального программирования, является то, что эти типичные решения часто совпадают (с точностью до имен переменных). Это связано с тем, что что в языке Haskell студенту не надо реализовывать ввод и вывод данных, подключать библиотеки и писать другои вспомогательныи код, которыи каждыи студент напишет немного по-другому. Решение простои задачи состоит, во многих случаях, из 1-10 строк кода.</p><p>Система автоматического засчитывания задач на основе правильных решении позволяет преподавателю хранить такие правильные решения в базе и засчитывать их автоматически (рис.2). Таким образом, у преподавателя освобождается время для работы с 10-20% студентов, приславших нестандартные решения -или решения с ошибками, или, наоборот, решения, использующие нестандартные подходы.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Рис.2. Пример типичных правильных решений</head><p>Отметим некоторые особенности засчитывания задач: 1. Даже если решение студента совпадает с правильным, ему не сообщается об этом сразу.</p><p>Преподаватель должен нажать кнопку «Засчитать одобренные решения», и это делается, как правило, раз или два в день. Смысл в том, чтобы студент не знал, что некоторые из его решении засчитываются автоматически. Как нам кажется, если студент будет знать, что при некоторых обстоятельствах его решения зачтется сразу, у него может возникнуть ощущение, что такое решения является более правильным, он может попытаться подобрать его и т.д. 2. Перед сравнением присланного решения с правильными образцами оно, в любом случае, проверяется тестами. Это значительно упрощает сравнение задач. Например, мы можем, заменять переменные на их порядковые номера (чтобы сравнить программы с точностью до имен переменных) и не беспокоиться о том, что можем про неправильную программу решить, что она в точности равна правильнои и засчитать. Сравниваемые программы точно по краи неи мере дают правильные результаты, иначе они не прошли бы тесты. Каталог типичных замечаний. Замечания, которые преподаватель пишет студентам, тоже часто повторяются. Как правило, для каждои задачи есть 3-5 типичных замечании , которые охватывают 30-80% всех случаев. В текущеи версии системы реализован простои набор средств, позволяющии облегчить процесс проставления замечании . Для каждои задачи можно ввести и запомнить несколько типичных замечании . При проверке задачи этот список показывается рядом с проверяемым решением, и преподаватель может одним нажатием вставить его в нужное место (рис. 3).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Рис.3. Пример типичных замечаний</head><p>Автоматизированное проставление замечаний. Еще одна возможность, реализованная в системе, но оказавшаяся не очень востребованнои , -это автоматизированное проставление замечании . Замечания могут снабжаться условием, при котором они возникают. В настоящее время условие -это просто фрагмент текста. Например, "if (" -это условие для того, чтобы добавить типичное замечание «После if скобки можно не писать».</p><p>По результатам эксплуатации выяснилось, что эта возможность востребована мало, и, видимо, требует доработки. Во-первых, как оказалось, для большинства реальных задач трудно сформулировать надежное условие, которе позволяло бы совершенно точно добавить это замечание. При этом цена ошибки довольно высока. Не сообщить студенту об ошибке не так страшно, а вот написать ему об ошибке, которую он, на самом деле, не делал, это было бы неприятно. Поэтому в следующеи версии предполагается реализовать более надежныи подход, в котором замечания проставляются автоматически только в тех случаях, когда мы точно в этом уверены.</p><p>Недостатки текущеи версии системы и планируемые дополнения В настоящее время проектируется следующая версия системы. Опишем ее основные возможности:</p><p>1. Нормализация типичных решений Даже в самых простых задачах все-таки образуется много типичных решении из-за того, что студенты используют разные варианты записи конструкции . Приведем простои пример. Допустим, в задаче требуется записать выражение x*x+1. Даже те студенты, которые прислали в остальном одинаковое решение, напишут это по-разному -x^2+1, 1+x*x, (x*x)+1, (x*x+1) и различные сочетания этих вариантов. Таким образом, приходится хранить в базе очень много похожих вариантов решения.</p><p>Для решения этои проблемы предполагается задавать набор преобразовании , которые, если есть такая возможность, следует применить к решению, чтобы привести его к единому нормализованному виду. Например, в рассмотренном выше примере, таким преобразованиями могли бы быть правила «Заменить x*x на x^2" и т.д. Применение таких преобразовании позволит значительно уменьшить набор правильных решении , хранящихся в системе. Схожая технология для автоматическои генерации замечании описана в <ref type="bibr" target="#b4">[6]</ref>.</p><p>2. Автоматическая обработка типичных неправильных или не совсем правильных решений. Хотелось бы иметь возможность автоматически засчитывать (или не засчитывать) типичные не совсем правильные решения задач, добавляя, при необходимости, нужные замечания. Сеи час в системе это не предусмотрено, автоматически можно засчитывать только полностью правильные задачи. Это добавление просто реализовать, и оно существенно упростило бы работу преподавателя.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Генерация статистки по типичным решениям</head><p>Хотелось бы иметь представление о том, как распределились решения студентов -сколько процентов выбрало оптимальное решение, сколько не очень. Такая статистка, была бы полезна для преподавателя, и, видимо, интересна для студентов. Предполагается обеспечить возможность узнать, какои процент участников выбрал тот или инои вариант решения или сделал ту или иную типичную ошибку.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Контроль списывания</head><p>При использовании автоматического засчитывания задач стала еще более актуальнои проблема борьбы со списыванием. Списывание является сложнои проблемои и вряд ли возможно решить ее полностью, особенно для такого курса, где одинаковые решения для многих задач являются скорее нормои . Но хотелось бы обнаруживать хотя бы самые очевидные случаи, например, полностью идентичные решения.</p><p>Следует отметить, однако, что анонимныи опрос, проведенныи среди участников курсов прошлых лет <ref type="bibr" target="#b5">[7]</ref> показал, что большинство участников, если и писали задачи не самостоятельно, то делали это 1-2 раза за курс. Возможно это связано с подбором задач, они, именно с целью минимизировать списывание даются или достаточно простыми, чтобы даже слабо подготовленным студентам было интересно попробовать решить из самим, или достаточно сложными, чтобы студенты не рисковали копировать чужое решения, понимая, что это легко может быть обнаружено.</p><p>Тем не менее, предполагается включить в состав системы базовые возможности по контролю за списыванием:</p><p>Проверка задач на точное совпадение, с учетом имен переменных, пробелов и переносов. Ведение статистики по неточному совпадению и поиск пар участников, у которых большое количество задач совпадают без учета имен переменных, пробелов и других простых преобразовании .</p><p>Более далекие планы развития системы Перечислим кратко направления, в которых предполагается развивать систему в дальнеи шем:</p><p>Персонализация замечаний. Часто бывает, что преподаватель пишет разные замечания для однои и тои же ошибки для разных студентов. Текст зависит от подготовки студента (сильным студентам требуется короткое замечание, а слабым -более подробное), от того, делал ли студент уже эту ошибку раньше, иногда и от других факторов. Предполагается обеспечить поддержку таких персонализированных сообщении . Для этого в системе должна храниться информация об уровне подготоки студента, об уже полученных им замечаниях, возможно и другая информация, помогающая обеспечить более понятное для данного участника сообщение.</p><p>Использование методов извлечения знаний для сопоставления. Возможным направлением развития системы является использование методов извлечения знании для сопоставления программ, не совпадающих с типичными образцами, и типичных замечании . Аналогичная работа описана в <ref type="bibr" target="#b6">[8]</ref>, там с этои целью используются методы кластеризации. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Литература</head></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Рис. 1 .</head><label>1</label><figDesc>Пример теста со сложным условием Автоматизация проверки задач Для большинства задач засчитывание их только по тестам представляется, на наш взгляд, недостаточным. Особенно это относится к простым задачам. Для таких задач имеет значение, не только то, что задача прошла тесты, но и как она написана. Студент может выбрать неоптимальныи алгоритм, или использовать не лучшее представление данных, или даже просто использовать неудачное имя переменнои , и на такие ошибки очень желательно ему указать. На наш взгляд, именно замечания, которые студент получает от преподавателя, являются наиболее важным элементом процесса обучения (и это подтверждают многие отзывы студентов, окончивших курс). Приведем некоторые другие причины, по которым засчитывание задач на основе тестов является нежелательным:  Многие задачи включают в себя дополнительные условия. Например, «Решение не должно использовать рекурсию» или «Решение должно использовать функцию foldr» или «Решение должно использовать стиль передачи продолжении (continuation-passing style)». Для проверки таких условии тестов, естественно, недостаточно.  Преподавателю важно получить представление о том, какие варианты решения и какие ошибки наиболее типичны для данных студентов, что у них вызывает трудности. Именно разбор типичных ошибок является, по нашему опыту, однои из наиболее интересных и полезных для студента частью занятия.  К сожалению, еще одна важная проблема автоматического засчитывания программ по тестам -это списывание. В отличие от массовых онлаи н курсов, мы точно не можем тут рассчитывать на сознательность участников. Таким образом, одна из целеи , которои мы пытаемся добиться на курсе -это чтобы у студентов возникало ощущение личного общения с преподавателем, и чтобы он получал личные замечания о его программе -комментарии об ошибках, советы и т.д. Такои подход неизбежно требудет довольно больших трудозатрат. В то же время и при таком подходе есть возможность облегчить работу преподавателя. В.И.Шаи тан в 2016 году при подготовке бакалаврскои ВКР разработал систему автоматического зачитывания задач на основе типичных решении и автоматизированного проставления замечании . Рассмотрим ее основные возможности.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head></head><label></label><figDesc>Подготовка и заинтересованность студентов варьируется, но большинство студентов, около 60%, достаточно хорошо подготовлены и активно участвуют в работе, решая большое количество задач. Остальные примерно пополам делятся на очень хорошо подготовленных студентов, для которых приходится придумывать задачи повышеннои сложности, и на студентов, которые не проявляют интерес к материалу. Для последних приходится формулировать четкии минимум знании и умении , и, в том числе, задач, которые они должны уметь решать для получения зачета.Методическои основои курса является большое количество задач. Каждую неделю дается примерно 8-10 задач. Их можно разбить на следующие группы:Задачи для закрепления материала. После каждого занятия на дом даются 4-5 задач, обычно достаточно простых. Эти задачи используются, для того, чтобы и преподаватель, и сами студенты могли проверить, как они освоили текущии материал. Иногда они используются, чтобы подготовить студентов к восприятию очередного занятия. Эти задачи почти всегда разбираются на следующем занятии Дополнительные задачи. Каждую неделю дается 2-3 задачи посложнее, они предназначены для хорошо подготовленных студентов. Их решение -это достаточно большая и сложная программа и они, как правило, на занятиях не разбираются.</figDesc><table><row><cell>Дополнительные задачи 'на обычном языке'. Каждую неделю дается дополнительная задача</cell></row><row><cell>'на обычном языке'. В неи студентам предлагается реализовать рассмотренные на занятии темы на</cell></row><row><cell>каком-нибудь распространенном языке (C#, C++, Java, Python и т.д.)</cell></row><row><cell>Таким образом, на преподавателя ложится довольно большая нагрузка. Каждую неделю</cell></row><row><cell>приходится проверять около 150 задач. Хотя большинство из них простые, нагрузка, тем не менее,</cell></row><row><cell>очень значительная, и справиться с неи без инструментальных средств было бы невозможно. В</cell></row><row><cell>дальнеи шем мы будем говорить о средствах, которые позволяют упросить проверку задач первых</cell></row><row><cell>двух типов. Задачи на обычном языке настоящее время проверяются вручную.</cell></row><row><cell>Система тестирования задач</cell></row><row><cell>Для проверки задач используется тестирование. Оно было реализовано в системе в первои</cell></row><row><cell>версии, в 2011 г., в дипломнои работе, выполненнои А.Ю.Соловьевым. К задачам прилагаются тесты,</cell></row><row><cell>и решение, не прошедшее эти тесты, не считается засчитанным.</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head></head><label></label><figDesc>Sumit, Ivan Radicek, and Florian Zuleger. "Automated Clustering and Program Repair for Introductory Programming Assignments." arXiv preprint arXiv:1603.03165 (2016).</figDesc><table><row><cell>1.</cell><cell cols="9">Функциональное программирование (мат-мех СПбГУ) URL: http://msimuni.wikidot.com/fp4</cell><cell></cell><cell></cell><cell></cell></row><row><cell>2.</cell><cell cols="9">Функциональное программирование. Страница пользователя URL: http://solvetask.ru/fp4</cell><cell></cell><cell></cell><cell></cell></row><row><cell>3.</cell><cell cols="5">Haskell Language URL: https://www.haskell.org/.</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row><row><cell>4.</cell><cell cols="12">Функциональное программрование на языке Haskell -Stepic.org URL: https://stepik.org/course/Функциональное-</cell></row><row><cell></cell><cell cols="5">программирование-на-языке-Haskell-75.</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row><row><cell>5.</cell><cell cols="5">Sphere Online Judge (SPOJ) URL: http://www.spoj.com/.</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row><row><cell>6.</cell><cell cols="12">Singh, Rishabh and Gulwani, Automated Feedback Generation for Introductory Programming Assignments. SIGPLAN Not. 48</cell></row><row><cell></cell><cell cols="3">(6), 2013, pp.15-26</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row><row><cell>7.</cell><cell>Анкета</cell><cell>про</cell><cell>списывание</cell><cell>и</cell><cell>совместную</cell><cell>работу</cell><cell>над</cell><cell>решениями</cell><cell>в</cell><cell>курсе</cell><cell>ФП</cell><cell>URL:</cell></row><row><cell></cell><cell cols="7">http://webanketa.com/forms/64r38c1r6rqkjdhpcgtk0rk1/ru/statistic/</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row><row><cell>8.</cell><cell>Gulwani,</cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell><cell></cell></row></table></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<ptr target="http://msimuni.wikidot.com/fp4" />
		<title level="m">Functional Programming (mat-meh SPbGU</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<ptr target="http://solvetask.ru/fp4" />
		<title level="m">Functional Programming</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<ptr target="https://stepik.org/course/Функциональное-программирование-на-языке-Haskell-75" />
		<title level="m">Functional Programming in Haskell -Stepic</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<ptr target="http://www.spoj.com/" />
		<title level="m">Sphere Online Judge</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Automated Feedback Generation for Introductory Programming Assignments</title>
		<author>
			<persName><forename type="first">Rishabh</forename><surname>Singh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gulwani</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">SIGPLAN Not</title>
		<imprint>
			<biblScope unit="volume">48</biblScope>
			<biblScope unit="issue">6</biblScope>
			<biblScope unit="page" from="15" to="26" />
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<ptr target="http://webanketa.com/forms/64r38c1r6rqkjdhpcgtk0rk1/ru/statistic/" />
		<title level="m">Poll on cheating in functional programming course</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">Automated Clustering and Program Repair for Introductory Programming Assignments</title>
		<author>
			<persName><forename type="first">Sumit</forename><surname>Gulwani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ivan</forename><surname>Radicek</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Florian</forename><surname>Zuleger</surname></persName>
		</author>
		<idno type="arXiv">arXiv:1603.03165</idno>
		<idno>Поступила 14.10.2016</idno>
		<imprint>
			<date type="published" when="2016">2016</date>
		</imprint>
	</monogr>
	<note type="report_type">arXiv preprint</note>
</biblStruct>

<biblStruct xml:id="b7">
	<monogr>
		<title level="m">Об авторах: Симуни Михаил Лазаревич, старшии преподаватель кафедры информатики математико-механического факультета Санкт-Петербургского государственного университета</title>
				<imprint/>
	</monogr>
	<note>simuni@mail</note>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<title level="m">Соловьев Алексей Юрьевич</title>
				<imprint>
			<publisher>JobToday SA</publisher>
		</imprint>
	</monogr>
	<note>ведущии программист</note>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<author>
			<persName><forename type="first">Шайтан</forename><surname>Василий</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ильич</forename></persName>
		</author>
		<title level="m">студент Санкт-Петербургского политехнического университета Петра Великого, институт компьютерных наук и технологии</title>
				<imprint/>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
