2015-09-11 5 views
3

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

ответ

2

(\+)/1 это metacall встроенной и (ссылаясь на !/0 документов)

Меты призвание непрозрачно для разреза.

примеры, специально t4, иллюстрируют оперативное семантический

+2

Извините, но пример t4 является ** ** неправильно. Не существует предиката '(\ +)/3'. – false

+2

В отличие от документации SWI, '(\ +)/1' обрабатывается (некорректно) как конструктор управления, поэтому он не обрабатывается, как встроенный. В качестве примера рассмотрим: 'call ((fail, \ + 1))', который должен завершиться неудачей, но в SWI это ошибка. Это несоответствующее поведение, характерное для SWI. – false

Смежные вопросы