Я все еще очень плохо знаком с прологом и пытаюсь понять, почему математические ограничения не работают так же, как логические.
Похоже, информации достаточно для решения этой проблемы:
f(A, B) :- A = (B xor 2).
Но когда я пытаюсь f(C, 3)
, я возвращаюсь C = 3 xor 2.
, что не очень помогает. Еще менее полезным является тот факт, что он просто не может найти решение, если входные данные поменялись местами. Использование is
вместо =
приводит к тому, что входные данные примера возвращают правильный ответ, но обратное действие даже не пытается что-либо предпринять.
Из моих предыдущих экспериментов я понял, что я мог бы написать функцию, которая бы делала это логически, используя двоичный файл без проблем, и на самом деле это пошло бы в обе стороны. Что отличает математику?
Для справки, моя первая попытка решить мою проблему выглядит так:
f(Input, Output) :-
A is Input xor (Input >> 11),
B is A xor ((A >> 7) /\ 2636928640),
C is B xor ((B << 15) /\ 4022730752),
Output is C xor (C >> 18).
Это прекрасно работает при переходе от ввода к выводу, но не наоборот. Если я переключу is
на =
, он создаст длинную логическую последовательность с замененными значениями, но не может найти численное решение.
Я использую swi-пролог, в который встроен xor
, но его также легко можно определить. Я надеялся, что смогу использовать пролог для работы этой функции в обоих направлениях, и действительно не хочу реализовывать логическое поведение вручную. Любые предложения о том, как я мог бы переформулировать проблему, приветствуются.