0

我正在使用 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 匹配?

4

1 回答 1

2

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

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

正确的方法是

and(X,Y,Z) <=> Y == 0 | Z = 0.
于 2019-08-09T07:40:03.570 回答