2

我正在为学生作业评分,并希望自动在学生数据库上运行查询,并将这些查询的结果打印到文件中。我遇到的问题是我希望运行多个查询,但找不到一种方法来添加我希望作为命令行参数的所有查询。

相关文件


学生提交 Prolog 文件:

我无法向您展示这段代码,但学生们必须使用 Prolog 解决 4 个问题,并且我可以访问这些文件。


hw4_autograde.sh注意:编译器已更改为 SWI-prolog,而不是 gprolog。

在此处输入图像描述


testcases.txt: 这些是我希望运行的测试用例。它们包括对学生解决的 4 条规则/“功能”的各种调用。

在此处输入图像描述


我能够创建并附加到输出文件,但我需要先让我的 bash 脚本工作,然后可以添加所需的代码来做到这一点。任何帮助或正确方向的观点都是最有帮助的。

我试图仔细检查这篇文章,但我很难让它发挥作用:

https://lists.gnu.org/archive/html/users-prolog/2013-12/msg00004.html

谢谢你。


编辑:

Paulo Moura 在评论中描述的解决方案解决了这个问题,但是,在使用 logtalk 测试器时,我遇到了在提交中的子目录中使用多个 prolog 文件的问题。我曾经在学生文件正常工作的情况下获得输出,但现在所有测试都说崩溃了,当我过去通过或失败时:这是我当前运行时得到的屏幕截图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
)).

4

1 回答 1

1

您可以使用 Logtalk 的测试自动化来帮助执行评分。首先,将查询定义为测试。例如,假设学生需要定义foo/1bar/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.plbar.pl文件,保存在以学生 ID 命名的目录中。例如:

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.lgttester.lgt文件复制到每个学生目录后,logtalk_tester从包含学生目录的目录运行 shell 脚本submissions

$ cd submissions
$ logtalk_tester -p gnu -t 60

您将获得所有失败的测试以及任何损坏或超时的学生提交的完整报告。将报告后处理为您想要的。任何失败的测试都将以学生 ID 为前缀。还需要一些统计报告吗?

$ cd submissions
$ logtalk_tester -p gnu -t 60 -f xunit
$ logtalk_allure_report
$ allure open

有关详细信息,请参阅lgtunit工具文档。

请注意,此解决方案不应要求对学生提交的内容进行任何更改。有关如何测试普通 Prolog 代码的其他示例,请参见例如tests/prologLogtalk 发行版上的目录。该解决方案适用于所有 Logtalk 支持的后端 Prolog 编译器,包括 GNU Prolog。

于 2021-07-25T05:23:03.100 回答