prolog - 如何解决 Prolog 中未定义的过程错误?
问题描述
我在提供的计算机上编写了这段代码:
factor_in_inches(Unit, Scale) :- scale_of(Unit, Scale, inch).
scale_factor(Unit1, Unit2, Factor) :- scale_of(Unit2, Factor, Unit1).
%PartI
scales(BigUnit, Scale, LittleUnit) :-
scale(BigUnit, Scale, LittleUnit);
scale(LittleUnit, Scale1, BigUnit),
Scale is 1/Scale1.
%check if input follow base or reverse predicate
scale_of(BigUnit, Scale, LittleUnit) :-
scales(BigUnit, Scale, LittleUnit);
scales(BigUnit, Scale1, LittleUnit1),
scale_of(LittleUnit1, Scale2, LittleUnit),
Scale is Scale1 * Scale2.
%Checks if Unit1 * Quantity1 = Unit2 * Quantity2
convert(Unit1, Quantity1, Unit2, Quantity2) :-
factor_in_inches(Unit1, Scale1),
factor_in_inches(Unit2, Scale2),
Scale1 is round(Scale2 * Quantity2 / Quantity1).
我正在尝试为我的家庭作业运行一个小测试用例,如下所示:
:- begin_tests(imperial_part1).
test(factor_in_inches) :- factor_in_inches(inch, 1.0).
test(factor_in_inches) :- factor_in_inches(foot, 12.0).
test(factor_in_inches) :- factor_in_inches(rod, 198.0).
:- end_tests(imperial_part1).
但是,每当我运行测试时,都会收到以下错误:
ERROR: /Users/brianpattison/Desktop/Semester_2/Progamming_Languages/Prolog/SWI-Prolog.app/Contents/MacOS/imperial_hw.pl:67:
test factor_in_inches: received error: plunit_imperial_part1:'unit body'/2: Undefined procedure: plunit_imperial_part1:factor_in_inches/2
However, there are definitions for:
factor_in_inches/2
ERROR: /Users/brianpattison/Desktop/Semester_2/Progamming_Languages/Prolog/SWI-Prolog.app/Contents/MacOS/imperial_hw.pl:68:
test factor_in_inches: received error: plunit_imperial_part1:'unit body'/2: Undefined procedure: plunit_imperial_part1:factor_in_inches/2
However, there are definitions for:
factor_in_inches/2
ERROR: /Users/brianpattison/Desktop/Semester_2/Progamming_Languages/Prolog/SWI-Prolog.app/Contents/MacOS/imperial_hw.pl:69:
test factor_in_inches: received error: plunit_imperial_part1:'unit body'/2: Undefined procedure: plunit_imperial_part1:factor_in_inches/2
However, there are definitions for:
factor_in_inches/2
我已经尝试了很多次来解决这个问题,但我无法做到。
有什么建议么?
解决方案
该plunit
工具需要将您要测试的代码封装在一个模块中。您的代码中还缺少一个谓词scale/3
. 请尝试:
:- module(foo, []).
% your code here
:- begin_tests(imperial_part1).
% your tests here
:- end_tests(imperial_part1).
然后:
?- [foo], run_tests.
您将得到(由于缺少谓词):
ERROR: .../foo.pl:30:
test factor_in_inches: received error: foo:scales/3: Unknown procedure: foo:scale/3
However, there are definitions for:
foo:scales/3
ERROR: .../foo.pl:31:
test factor_in_inches: received error: foo:scales/3: Unknown procedure: foo:scale/3
However, there are definitions for:
foo:scales/3
ERROR: .../foo.pl:32:
test factor_in_inches: received error: foo:scales/3: Unknown procedure: foo:scale/3
However, there are definitions for:
foo:scales/3
添加缺少的谓词,您的测试应该运行。
推荐阅读
- node.js - 无法从 Node.js 中的 Amazon-S3 获取签名 URL
- ios - Apple Review 无法获得 Apple 健康许可
- mysql - 一个查询中的多个 COUNT(DISTINCT CAST(field AS DATE)
- ios - 从另一个控制器使用 UITextField 添加文本时,它不会显示在 UITableView
- javascript - Google Ads 脚本 - 将 Logger.log 内容发送到电子邮件?
- java - 在 Gradle Java 应用程序中没有拾取 Log4j2.properties 文件?
- php - 如何在phtml中创建垂直文本
- php - PHP & MySQL:如何将用户输入与数据库中的数据进行比较?
- python - Python。将字符串转换为包含 numpy 数组的字典
- python - 如何使用 lambda 和 map_fn 在 4d 张量的每个 2d 切片上应用 keras 层?