Пролог есть и =. Почему они не работают так же, как логические ограничения? - PullRequest
3 голосов
/ 16 февраля 2011

Я все еще очень плохо знаком с прологом и пытаюсь понять, почему математические ограничения не работают так же, как логические.

Похоже, информации достаточно для решения этой проблемы:

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, но его также легко можно определить. Я надеялся, что смогу использовать пролог для работы этой функции в обоих направлениях, и действительно не хочу реализовывать логическое поведение вручную. Любые предложения о том, как я мог бы переформулировать проблему, приветствуются.

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

Чистый Пролог не должен заниматься математикой. Основной алгоритм, который управляет Прологом - Unify и возврат в случае отказа - Не упоминает арифметические операторы. Большинство реализаций Пролога добавляют арифметику как некрасивый хак в их байт-код.

Причина этого в том, что арифметические функции не действуют так же, как функторы. Они не могут быть объединены таким же образом. Не каждая функция гарантированно работает для каждой комбинации основных и неосновных аргументов. Например, алгоритм повышения X до степени Y не симметричен нахождению Y-го корня X. Если бы все арифметические функции были симметричными, шифрование и криптография не работали!

Тем не менее, вот недостающие факты об операторах Пролога:

Во-первых, '=' - это не"равно" в Прологе, но "объединить". Цель X = Y op Z, где op - оператор, объединяет X с функтором 'op'(Y,Z). Это не имеет ничего общего с арифметическим равенством или присваиванием.

Во-вторых, is, уродливый математический хак, не гарантированно будет обратимым. Цель X is Expr, где Expr - это арифметическое выражение, сначала оценивает выражение, а затем пытается присвоить его X. Это не всегда будет работать для каждой комбинации чисел и переменных - обратитесь к документации библиотеки Prolog.

Подведем итог:

  • Написание обратимых математических функций требует математических знаний и алгоритма, чтобы сделать функцию обратимой. Пролог в этом случае не сделает магию для вас.
  • Если вы ищете интеллектуальное решение уравнений, вы можете проверить библиотеки решения ограничений Prolog для конечных и смежных областей. Не то же самое, что обратимая математика, но несколько умнее, чем наивные арифметические операторы Пролога.
0 голосов
/ 04 декабря 2016

Если вы хотите сравнить результат вычисления выражения, вы должны использовать оператор (=: =) / 2, или при проверке обособленности оператор (= / =) / 2.

Оператор работает также для побитовых операций, поскольку побитовые операции работают с целыми числами, а целые числа являются числами. Оператор является частью основного стандарта ISO. Для следующего пункта:

f(A, B) :- A =:= (B xor 2).

Я получаю следующие прогоны, в SWI-Prolog, Jekejeke Prolog и т.д ..:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.31)
Copyright (c) 1990-2016 University of Amsterdam, VU Amsterdam

?- f(100, 102).
true.

?- f(102, 100).
true.

?- f(100, 101).
false.

Если вы хотите более декларативный способ обработки битов, вы можете использовать SAT-решатель, интегрированный в Prolog. Хороший SAT-решатель должен также поддерживать ограниченные или неограниченные битовые векторы, но я не могу пока точно сказать, что здесь доступно и какие будут ограничения.

Смотрите, например, этот вопрос здесь: Пролог САТ Солвер

...