Использование сценария Bash Для Автоматизации тестирования файла Пролога

#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, но это добавило бы еще много тестов.