Поведение 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.