Как решить неопределенную ошибку процедуры в Прологе? - PullRequest
1 голос
/ 11 февраля 2020

Я написал этот фрагмент кода на предоставленном компьютере:

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

Я много раз пытался это исправить, и я не могу.

Есть предложения?

1 Ответ

3 голосов
/ 11 февраля 2020

Инструмент 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

Добавьте отсутствующий предикат и ваши тесты должен бежать.

...