Следующий код, как и ожидалось, выходы 123
из-за возвратов:Поведение сокращений отрицания
between(1,3,X), write(X), false.
Это одна с отрезанных выходов 1
, также, как и ожидалось:
between(1,3,X), write(X), !, false.
Но это один выходы 123
на удивление:
between(1,3,X), write(X), not(!).
not(!)
оценивает значение false, поэтому в одном случае имеет смысл, что он отступает, но в то же время он должен быть разрезан и, следовательно, не имеет других возможностей для изучения.
То же самое происходит с \+
вместо not/1
.
Почему сокращение не имеет никакого побочного эффекта при отрицании? Например, write/1
в not
имеет тот же побочный эффект, что и в случае, когда он не находится в одном.
Извините, но пример t4 является ** ** неправильно. Не существует предиката '(\ +)/3'. – false
В отличие от документации SWI, '(\ +)/1' обрабатывается (некорректно) как конструктор управления, поэтому он не обрабатывается, как встроенный. В качестве примера рассмотрим: 'call ((fail, \ + 1))', который должен завершиться неудачей, но в SWI это ошибка. Это несоответствующее поведение, характерное для SWI. – false