Я очень новичок в Mercury и логическом программировании в целом. Я не нашел такого числового примера в документах или примерах...
Возьмем пример предиката:
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is det.
diffThirtyFour(A,B) :-
( B = A + 34.0 ).
При этом А должен быть заземлен, а В свободен. Что, если я хочу, чтобы A был свободным, а B — заземленным (например, добавляя mode diffThirtyFour(out,in) is det.
). Можно ли выполнять такую алгебру во время компиляции? Я мог бы легко определить другой предикат, но это не кажется очень логичным...
Обновить
Итак, что-то вроде такого рода работ:
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is semidet.
:- mode diffThirtyFour(out, in) is semidet.
diffThirtyFour(A,B) :-
( B = A + 34.0, A = B - 34.0 ).
Немного опасаюсь semidet
и избыточности второй цели. Это единственный способ сделать это?
Обновление 2
Это может быть ответом ... он выдает предупреждение во время компиляции о том, что дизъюнкт никогда не имеет решений. Правильное предупреждение, но, возможно, ненужный запах кода? Это делает то, что мне нужно, но если есть лучшие решения, не стесняйтесь публиковать их...
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is det.
:- mode diffThirtyFour(out, in) is det.
diffThirtyFour(A,B) :-
( A = B - 34.0,
B = A + 34.0
;
error("The impossible happened...")
).