! / 0 должен прорезать (\ +) / 1 или нет?

С одной стороны:

$ sicstus
SICStus 4.6.0 (x86_64-linux-glibc2.17): Mon Apr  6 09:23:37 PDT 2020
[...]

| ?- \+ (!,false) ; X = 1.
yes

... с другой стороны ...

$ gprolog
GNU Prolog 1.4.5 (64 bits)
[...]

| ?- \+ (!,false) ; X = 1.
true ? ;
X = 1
yes

... также с другой стороны:

$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.2)
[...]

1 ?- \+ (!,false) ; X = 1.
true ;
X = 1.

Непонятно, не правда ли? Помоги пожалуйста!


person repeat    schedule 07.11.2020    source источник


Ответы (1)


Просто артефакт верхнего уровня SICStus Prolog. Попробуйте, например,

$ sicstus
SICStus 4.6.0 (x86_64-darwin-17.7.0): Mon Apr  6 18:23:42 CEST 2020
...
| ?- X = 0, \+ (!,false) ; X = 1.
X = 0 ? ;
X = 1 ? ;
no

Управляющая конструкция \+/1 непрозрачна для разрезов в SICStus Prolog, как того требует стандарт.

person Paulo Moura    schedule 07.11.2020