2016-04-21 3 views
3

У меня экзамен подходит, и я просматриваю прошлые документы, чтобы помочь понять.Constraint - SWI-Prolog Queries

я наткнулся на следующий вопрос бумаги прошлого:

Рассмотрим следующие вопросы и ответы. Некоторые ответы совпадают с , что будет делать SWI-Prolog, тогда как другие ошибочны. Укажите, какие ответы являются подлинными и какие из них являются поддельными (никакое объяснение вашего ответа не требуется ).

(i) |?- [A, B, C] ins 0 .. 2, A #= B + C. 

A = 0..2 B = 0..2 C = 0..2 

(ii) |?- A in 0 .. 3, A * A #= A. 

A = 0..2 

(iii) |?- [A, B] ins -1 .. 1, A #= B. 

A = 1 B = 1 

(iv) |?- [A, B] ins 0 .. 3, A #= B + 1. 

A = 1..3 B = 1..2 

Я изо всех сил, чтобы увидеть, как каждый из них является истинным или ложным. Кто-нибудь сможет объяснить мне, как это понять.

Спасибо, очень ценю помощь.

ответ

0

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

Итак, попробуйте «наметить» все переменные, то есть присвоить значения из ответов, сообщенных доменами. Конечно, если арифметическое отношение не выполняется, вы можете сказать, что ответ подделан. Возьмите ii). Сохраняется ли оно при A = 0? Что относительно A = 2?

Этого «теста», конечно, недостаточно, чтобы ответить на все вопросы. Некоторые зарегистрированные домены более узкие. Например, возьмите iii). Вы можете видеть какую-либо причину, исключающую -1 или 0. Если вы не можете, вы должны отметить ответ как фальшивый.

3

Ключевым принципом для принятия решения о том, какие ответы допустимы, а какие нет, является вопрос, является ли декларативная программа декларативным эквивалентом к исходному запросу. Если остаточные ограничения допускают какое-либо решение, которое нет в исходном запросе, или наоборот, тогда ответ является поддельным (или вы обнаружили ошибку в решателе CLP (FD)). Если показанный ответ даже не синтаксически действителен, тогда ответ определенно подделка.

Давайте сделаем это:

  1. (я) |?- [A, B, C] ins 0 .. 2, A #= B + C.

    предложил ответ: A = 0..2 B = 0..2 C = 0..2

    НЕПРАВИЛЬНО! Исходный запрос сжимает переменные до целых чисел, но этот ответ даже не является синтаксически допустимой программой Prolog.

  2. (б) |?- A in 0 .. 3, A * A #= A.

    предложил ответ: A = 0..2

    НЕПРАВИЛЬНО! Исходный запрос ограничивает A до целыми числами, но в соответствии с этой остаточной программой A = 0..2 является допустимым решением. Термин ..(0, 2) не является целым числом.

  3. (III) |?- [A, B] ins -1 .. 1, A #= B.

    предложил ответ: A = 1 B = 1

    НЕПРАВИЛЬНО! Не является синтаксически действительным.

  4. (IV) |?- [A, B] ins 0 .. 3, A #= B + 1.

    предложил ответ: A = 1..3 B = 1..2

    НЕПРАВИЛЬНО! Не является синтаксически действительным.

Обратите внимание, что даже если все указанные ответы были синтаксический действительными и=/2 были заменены in/2 в остаточных целях (I), (II) и (IV), этот ответ будет еще быть всеми неправильно, потому что в каждом случае вы можете найти решения, которые либо недопустимы исходным запросом, либо остаточными целями, но не оба. Я оставляю решение этих случаев в качестве упражнения для вас, к примеру, предположим, что соответствующие ответы:

  1. A in 0..2, B in 0..2, C in 0..2.
  2. A in 0..2.
  3. A = 1, B = 1.
  4. A in 1..3, B in 1..2.

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

Например, в случае (1), A = B = C = 2 будет правильным решением в соответствии с остаточными ограничений, но, очевидно, исходные ограничения исключают это решение, потому что 2 #= 2 + 2делает не держать!

+0

mmmh ... на самом деле в вопросе не упоминаются остатки. В случае i), я получаю 'A = 0..2 B = 0..2 C = 0..2' * и * остаточный' B + C# = A'. – CapelliC

+1

Для случая (i) вы получаете остаточные цели 'A в 0..2, B в 0..2, C в 0..2' и' B + C# = A'. Это декларативно эквивалентно исходному запросу. Если вы получили только «A в 0..2, B в 0..2, C в 0..2', то остаточная программа была бы неправильно * более общей *, чем исходный запрос. Остаточная программа всегда должна быть декларативно эквивалентна исходному запросу. Если вы получаете 'A = 0..2' среди других остатков, то' A' не является даже целым числом, а термином '0..2'. Если, как и в 'A = 0..2 B = 0..2', ответ даже не синтаксически важен, то он определенно подделка. – mat