#prolog #gnu-prolog
Вопрос:
Я нахожусь в процессе оценки заданий студентов и хочу автоматически запускать запросы в базе данных студентов и распечатывать результаты этих запросов в файл. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу выполнить несколько запросов, но не могу найти способ просто добавить все запросы, которые я хочу, в качестве аргумента командной строки.
Соответствующие Файлы
Подача студентом файла пролога:
Я не могу показать вам этот код, но студентам пришлось решить 4 задачи с помощью Prolog, и у меня есть доступ к этим файлам.
hw4_autograde.sh
ПРИМЕЧАНИЕ: Компилятор был изменен на SWI-prolog, а не на gprolog.
testcases.txt
: Это тестовые примеры, которые я хочу запустить. Они состоят из различных вызовов 4 правил/»функций», которые студенты решили.
Я могу создавать и добавлять выходные файлы, но сначала мне нужно, чтобы мой скрипт bash работал, а затем я могу добавить необходимый код для этого. Любая помощь или указание в правильном направлении были бы наиболее полезны.
Я попытался тщательно изучить этот пост, но изо всех сил пытаюсь заставить его работать:
https://lists.gnu.org/archive/html/users-prolog/2013-12/msg00004.html
Спасибо.
Редактировать:
Решение, описанное Пауло Моурой в комментариях, решает эту проблему, однако при использовании тестера logtalk я сталкиваюсь с проблемами использования нескольких файлов пролога в подкаталогах из отправленных материалов. Раньше я получал выходные данные с работающими файлами учащихся, но теперь все тесты говорят, что я потерпел крах, когда я проходил или не прошел: вот снимок экрана того, что я сейчас получаю при запуске logtalk_tester -p swi -t 60
:
Ниже приведен снимок экрана того, что находится в подкаталоге учащегося:
Вот tests.lgt
:
:- object(tests,
extends(lgtunit)).
%Tests for shuffle
%--------------------------------------------------------
test(shuff_working) :-
{shuffle([a,b,c],[d,e,f],[a,d,b,e,c,f])}.
test(shuff_wrong, false) :-
{shuffle([a,b,d],[d,e,f],[a,d,b,e,c,f])}.
test(shuff_wrong_2, false) :-
{shuffle([d,e,f],[a,b,d],[a,d,b,e,c,f])}.
test(shuff_wrong_3, false) :-
{shuffle([a,b,c,e],[d,e,f],[a,d,b,e,c,f])}.
test(shuff_var) :-
{shuffle(X,Y,[1,2,3,4,5,6])}.
%--------------------------------------------------------
%Tests for double
test(doub_working) :-
{double([a,b,c],[a,a,b,b,c,c])}.
test(doub_wrong, false) :-
{double([a,b,c],[a,b,c,a,b,c])}.
test(doub_var_1) :-
{double(X,[a,a,b,b,c,c])}.
test(doub_var_2) :-
{double([a,b,c],X)}.
%--------------------------------------------------------
%Part 2: Sudoku Solver
test(sudoku, false) :-
{test0}.
:- end_object.
Вот tester.lgt
:- initialization((
% minimize output to the essential
set_logtalk_flag(report, warnings),
% load the student submissions
logtalk_load(['hw4.pl','sudoku.pl']),
% load the testing tool
logtalk_load(lgtunit(loader)),
% load the tests and run them
logtalk_load(tests, [hook(lgtunit)]),
tests::run
)).
Ответ №1:
Вы можете использовать автоматизацию тестирования Logtalk, чтобы помочь выполнить оценку. Во-первых, определите запросы как тесты. В качестве примера предположим, что учащиеся должны определить foo/1
и bar/2
предикаты, а затем при вызове должны успешно выполнить привязки foo(42)
и bar(a,d)
. Затем мы можем определить tests.lgt
файл с этими двумя тестами:
:- object(tests,
extends(lgtunit)).
test(foo, true(N == 42)) :-
% call foo/1 in "user"
{foo(N)}.
test(bar, true(X-Y == a-d)) :-
% call bar/2 in "user"
{bar(X,Y)}.
:- end_object.
Предположим, что учащиеся отправляют свой код foo.pl
и bar.pl
файлы, сохраненные в каталогах, названных в честь студенческого удостоверения. Например:
submissions
id1
foo.pl
bar.pl
id2
foo.pl
bar.pl
Вам также понадобится tester.lgt
файл драйвера:
:- initialization((
% minimize output to the essential
set_logtalk_flag(report, warnings),
% load the student submissions
logtalk_load(['foo.pl', 'bar.pl']),
% load the testing tool
logtalk_load(lgtunit(loader)),
% load the tests and run them
logtalk_load(tests, [hook(lgtunit)]),
tests::run
)).
После копирования файлов tests.lgt
и tester.lgt
в каждый из каталогов учащихся запустите сценарий logtalk_tester
оболочки из каталога, submissions
содержащего каталоги учащихся:
$ cd submissions
$ logtalk_tester -p gnu -t 60
Вы получите полный отчет обо всех проваленных тестах и любых неработающих или просроченных заявках студентов. Обработайте отчет так, как вы хотите. Все проваленные тесты будут предваряться студенческим удостоверением. Также нужен какой-нибудь статистический отчет?
$ cd submissions
$ logtalk_tester -p gnu -t 60 -f xunit
$ logtalk_allure_report
$ allure open
Дополнительные сведения см. в lgtunit
документации по инструменту.
Обратите внимание, что это решение не должно требовать каких-либо изменений в материалах учащихся. Другие примеры тестирования простого кода пролога см., например, в tests/prolog
каталоге дистрибутива Logtalk. Это решение будет работать со всеми компиляторами внутреннего пролога, поддерживаемыми Logtalk, включая GNU Prolog.
Комментарии:
1. Спасибо за сообщение. Когда вы говорите, что определяете запросы как тесты, в каком формате? Будет ли достаточно приведенного выше снимка экрана моего файла тестирования? Я потратил около получаса, просматривая документацию logtalk по тестеру ( logtalk.org/testing.html ) и не до конца понимаю, как это реализовать. Вы упомянули, что запустили его в каталоге, содержащем каталоги учащихся. Будет ли logtalk автоматически определять, где находятся файлы пролога, и запускать их в базах данных учащихся?
2. Я расширил ответ, чтобы предоставить более подробную информацию о решении.
3. Привет, Пауло, пока это работает очень хорошо, я просмотрел документацию для определения тестов, но еще не пробовал ее в нескольких каталогах учащихся. Я также должен вручную проверить предикаты формы
foo(X,Y,[a,b,c,d,e,f]).
, которые возвращали бы значения для X и Y. Существует ли механизм тестирования, который позволяет это сделать? Еще раз спасибо вам за замечательные детали. Это было так полезно для моей работы.4. Почему «проверка вручную»? Разве то, что вы хотите проверить, не может быть выполнено путем определения подходящих тестов, которые могут быть автоматизированы?
5. Извините, поскольку я новичок в прологе, но, например, может быть набор перестановок X и Y, связанных с
foo(X,Y,[a,b,c,d,e,f]).
этим, которые растут экспоненциально с размером списка в 3-м аргументе. Я полагаю, что я могу просто проверить, работает ли он с определенными значениями X и Y, но это добавило бы еще много тестов.