简单and()规则的SWI Prolog中的CHR行为

简单and()规则的SWI Prolog中的CHR行为,prolog,constraint-handling-rules,Prolog,Constraint Handling Rules,我正在使用CHR库在SWI Prolog中尝试一个简单的程序 对这些问题的回答对我来说是显而易见的,但追踪让我感到困惑 我一开始只有一条规则 and(X,Y,Z) <=> Y = 0 | Z = 0. 和(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,_730

我正在使用CHR库在SWI Prolog中尝试一个简单的程序

对这些问题的回答对我来说是显而易见的,但追踪让我感到困惑

我一开始只有一条规则

and(X,Y,Z) <=> Y = 0 | Z = 0.
和(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) .
?-和(A,B,C)。
CHR:(0)插入:和(U 73048、U 73416、U 73052)
CHR:(1)呼叫:和(_73048,_73416,_73052)#?[爬行]
CHR:(1)出口:和(U 73048、U 73416、U 73052)?[爬行]
CHR:(1)唤醒:和(_73048,_73416,_73052)#?[爬行]
CHR:(1)出口:和(U 73048、U 73416、U 73052)?[爬行]
CHR:(1)重做:和(_73048,_73416,_73052)
CHR:(0)失败:和(_73048,_73416,_73052)#?[爬行]
及(A,B,C)。
我增加了一条新规则

and(X,Y,Z) <=> Y = 0 | Z = 0.
and(X,Y,Z) <=> X = 0 | Z = 0.
和(X,Y,Z)Y=0 | Z=0。
和(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) .
?-和(A,B,C)。
CHR:(0)插入:和(80150、80184、79780)
呼叫:和(80150,80184,79780)#?[爬行]
CHR:(1)出口:和(80150、80184、79780)?[爬行]
(1)唤醒:和(80150、80184、79780)#?[爬行]
CHR:(2)唤醒:和(80150,0,79780)#?[爬行]
...
及(A,B,C)。

为什么这
和(80150,0,79780)
?为什么
Y
变量与0匹配?

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

Y=0
在Prolog的保护中,Y与0统一,所以我想这就是为什么我存储了第二条规则

正确的方法应该是

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

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

Y=0
在Prolog的保护中,Y与0统一,所以我想这就是为什么我存储了第二条规则

正确的方法应该是

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

hmmm。。。Y=0将Y与0统一起来,这就是为什么我在约束存储中得到第二条规则?嗯。。。Y=0将Y与0统一起来,这就是为什么我在约束存储中得到第二条规则?