【问题标题】:CHR behavior in SWI Prolog for simple and() ruleSWI Prolog 中用于简单 and() 规则的 CHR 行为
【发布时间】: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


【解决方案1】:

我认为这是一个愚蠢的问题……作为初学者,我有时会忘记宿主语言。

Y = 0 在 Prolog 的守卫中将 Y 与 0 统一,所以我想这就是我得到第二条规则的原因。

正确的方法应该是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多