SWI Prolog 中的 CHR 行为用于简单的 and() 规则
CHR behavior in SWI Prolog for simple and() rule
我正在尝试使用 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 匹配?
我认为这是一个愚蠢的问题...作为初学者,我有时会忘记宿主语言。
Y = 0
在 Prolog 的守卫中将 Y 统一为 0 所以我想这就是为什么我得到第二条规则的原因。
正确的做法是
and(X,Y,Z) <=> Y == 0 | Z = 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 匹配?
我认为这是一个愚蠢的问题...作为初学者,我有时会忘记宿主语言。
Y = 0
在 Prolog 的守卫中将 Y 统一为 0 所以我想这就是为什么我得到第二条规则的原因。
正确的做法是
and(X,Y,Z) <=> Y == 0 | Z = 0.