Поведение CHR в прологе SWI для простого и () правила

Я пробовал простую программу в SWI-Prolog с использованием библиотеки CHR.

Ответы на вопросы для меня очевидны, но отслеживание сбило меня с толку.

Я начал только с одного правила.

and(X,Y,Z) <=> Y = 0 | Z = 0.

Трассировка имеет смысл

?-  and(A,B,C).
CHR:   (0) Insert: and(_73048,_73416,_73052) # <357>
CHR:   (1) Call: and(_73048,_73416,_73052) # <357> ? [creep]
CHR:   (1) Exit: and(_73048,_73416,_73052) # <357> ? [creep]
CHR:   (1) Wake: and(_73048,_73416,_73052) # <357> ? [creep]
CHR:   (1) Exit: and(_73048,_73416,_73052) # <357> ? [creep]
CHR:   (1) Redo: and(_73048,_73416,_73052) # <357>
CHR:   (0) Fail: and(_73048,_73416,_73052) # <357> ? [creep]
and(A, B, C) .

Я добавил новое правило

and(X,Y,Z) <=> Y = 0 | Z = 0.
and(X,Y,Z) <=> X = 0 | Z = 0.

Теперь трассировка стала для меня странной. Я ожидал похожий след, но я получил это...

?-  and(A,B,C).
CHR:   (0) Insert: and(_80150,_80184,_79780) # <488>
CHR:   (1) Call: and(_80150,_80184,_79780) # <488> ? [creep]
CHR:   (1) Exit: and(_80150,_80184,_79780) # <488> ? [creep]
CHR:   (1) Wake: and(_80150,_80184,_79780) # <488> ? [creep]
CHR:   (2) Wake: and(_80150,0,_79780) # <488> ? [creep]
...
and(A, B, C) .

Почему это and(_80150,0,_79780)? Почему Y переменная соответствует 0?

1 ответ

Решение

Я думаю, что это был глупый вопрос с моей стороны... Как начинающий, я иногда забывал о принимающем языке.

Y = 0 в гвардии в Прологе объединил Y с 0, так что я думаю, именно поэтому я получил второе правило в магазине.

Правильный подход был бы

and(X,Y,Z) <=> Y == 0 | Z = 0.
Другие вопросы по тегам