我正在对学生作业进行评分,并希望在学生数据库上自动运行查询,并将这些查询的结果打印到文件中。我遇到的问题是,我希望运行多个查询,但无法找到一种方法来将我希望的所有查询添加为命令行参数。
相关文件
学生提交Prolog文件:
我不能向您展示这段代码,但是学生们必须使用Prolog解决4个问题,而且我可以访问这些文件。
hw4_autograde.sh注意:编译器被更改为SWI,而不是gprolog。

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

我能够创建并附加到输出文件,但我需要首先让bash脚本工作,然后才能添加所需的代码。任何援助或一个正确方向的点都将是最有帮助的。
我试过仔细检查这篇文章,但我很难做到这一点:
https://lists.gnu.org/archive/html/users-prolog/2013-12/msg00004.html
谢谢。
编辑:
保罗·莫拉在评论中描述的解决方案解决了这个问题,然而,在使用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
)).发布于 2021-07-25 05:23:03
您可以使用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文件复制到每个学生目录中后,从包含学生目录的submissions目录中运行logtalk_tester shell脚本:
$ cd submissions
$ logtalk_tester -p gnu -t 60你将得到一个完整的报告,所有失败的考试和任何失败或超时的学生提交。把报告处理到你想要的地方。任何不及格的考试都将以学生证为前缀。还需要一些统计报告吗?
$ cd submissions
$ logtalk_tester -p gnu -t 60 -f xunit
$ logtalk_allure_report
$ allure open有关详细信息,请参阅lgtunit工具文档。
请注意,此解决方案不需要对学生提交的内容进行任何更改。有关如何测试普通Prolog代码的其他示例,请参见Logtalk发行版上的tests/prolog目录。此解决方案将适用于所有支持Logtalk的后端Prolog编译器,包括GNU Prolog。
https://stackoverflow.com/questions/68514037
复制相似问题