【发布时间】:2019-08-09 15:40:03
【问题描述】:
我正在使用 CHR 库在 SWI-Prolog 中尝试一个简单的程序。
对查询的响应对我来说是显而易见的,但追踪让我感到困惑。
我从一个规则开始。
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?
【问题讨论】:
-
hmmm... Y = 0 将 Y 与 0 统一起来,这就是我在约束存储中获得第二条规则的原因?
标签: prolog constraint-handling-rules