使用 Bash 脚本自动测试 Prolog 文件
Using a Bash Script To Automate Testing of A Prolog File
我正在给学生作业打分,希望自动 运行 查询学生数据库,并将这些查询的结果打印到文件中。我 运行 遇到的问题是我希望 运行 多个查询,但找不到一种方法来将我希望的所有查询添加为命令行参数。
相关文件
学生提交的 Prolog 文件:
我无法向您展示这段代码,但学生们必须使用 Prolog 解决 4 个问题,而我可以访问这些文件。
hw4_autograde.sh
注意:编译器已更改为 SWI-prolog,而不是 gprolog。
testcases.txt
:这些是我想要的测试用例运行。它们包括对 4 条规则的各种调用/'functions' 学生解决了。
我能够创建并附加到输出文件,但我需要先让我的 bash 脚本运行,然后才能添加所需的代码来执行此操作。任何帮助或指向正确方向的观点都会很有帮助。
我已尝试仔细检查此 post,但正在努力使其正常工作:
https://lists.gnu.org/archive/html/users-prolog/2013-12/msg00004.html
谢谢。
编辑:
Paulo Moura 在评论中描述的解决方案解决了这个问题,但是,在使用 logtalk 测试器时,我遇到了在提交的子目录中使用多个序言文件的问题。我曾经在学生文件工作时获得输出,但现在所有测试都说崩溃了,当我过去通过或失败时:这是 运行ning [=15= 时我当前得到的屏幕截图]:
下面是学生子目录中内容的屏幕截图:
这里是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
)).
您可以使用 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
文件中提交他们的代码,保存在以学生 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.lgt
和 tester.lgt
文件复制到每个学生目录后,运行 logtalk_tester
shell 脚本来自 submissions
包含学生目录的目录:
$ cd submissions
$ logtalk_tester -p gnu -t 60
您将获得所有失败测试以及任何损坏或超时的学生提交的完整报告。 Post-将报告处理成你想要的。任何失败的测试都将以学生 ID 为前缀。还需要一些统计报告吗?
$ cd submissions
$ logtalk_tester -p gnu -t 60 -f xunit
$ logtalk_allure_report
$ allure open
有关详细信息,请参阅 lgtunit
工具文档。
请注意,此解决方案不应要求对学生提交的内容进行任何更改。有关如何测试普通 Prolog 代码的其他示例,请参见例如Logtalk 发行版中的 tests/prolog
目录。该解决方案适用于所有 Logtalk 支持的后端 Prolog 编译器,包括 GNU Prolog。
我正在给学生作业打分,希望自动 运行 查询学生数据库,并将这些查询的结果打印到文件中。我 运行 遇到的问题是我希望 运行 多个查询,但找不到一种方法来将我希望的所有查询添加为命令行参数。
相关文件
学生提交的 Prolog 文件:
我无法向您展示这段代码,但学生们必须使用 Prolog 解决 4 个问题,而我可以访问这些文件。
hw4_autograde.sh
注意:编译器已更改为 SWI-prolog,而不是 gprolog。
testcases.txt
:这些是我想要的测试用例运行。它们包括对 4 条规则的各种调用/'functions' 学生解决了。
我能够创建并附加到输出文件,但我需要先让我的 bash 脚本运行,然后才能添加所需的代码来执行此操作。任何帮助或指向正确方向的观点都会很有帮助。
我已尝试仔细检查此 post,但正在努力使其正常工作:
https://lists.gnu.org/archive/html/users-prolog/2013-12/msg00004.html
谢谢。
编辑:
Paulo Moura 在评论中描述的解决方案解决了这个问题,但是,在使用 logtalk 测试器时,我遇到了在提交的子目录中使用多个序言文件的问题。我曾经在学生文件工作时获得输出,但现在所有测试都说崩溃了,当我过去通过或失败时:这是 运行ning [=15= 时我当前得到的屏幕截图]:
下面是学生子目录中内容的屏幕截图:
这里是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
)).
您可以使用 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
文件中提交他们的代码,保存在以学生 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.lgt
和 tester.lgt
文件复制到每个学生目录后,运行 logtalk_tester
shell 脚本来自 submissions
包含学生目录的目录:
$ cd submissions
$ logtalk_tester -p gnu -t 60
您将获得所有失败测试以及任何损坏或超时的学生提交的完整报告。 Post-将报告处理成你想要的。任何失败的测试都将以学生 ID 为前缀。还需要一些统计报告吗?
$ cd submissions
$ logtalk_tester -p gnu -t 60 -f xunit
$ logtalk_allure_report
$ allure open
有关详细信息,请参阅 lgtunit
工具文档。
请注意,此解决方案不应要求对学生提交的内容进行任何更改。有关如何测试普通 Prolog 代码的其他示例,请参见例如Logtalk 发行版中的 tests/prolog
目录。该解决方案适用于所有 Logtalk 支持的后端 Prolog 编译器,包括 GNU Prolog。