如何解决CHR:如何在规则中调用 Prolog 代码
CHR:如何在规则中调用 Prolog 代码? 我认为它就像 DCG !!!但好像不对
:- use_module(library(chr)).
:- chr_constraint move/2,pos/2,next/0.
:- [utils].
main :- pos(5,5).
rand(X,Y) :- random(0,2,X),random(0,Y),say("~w,~w",[X,Y]).
pos(X,move(A,B) <=> pos(6,6).%X1 > 0,X1 < 10,Y1 > 0,Y1 < 10 | pos(X1,Y1),{X1 is X + A,Y1 is Y + B}.
next <=> move(X,{rand(X,Y)}. <<<-----
错误:
?- pos(5,5),next.
ERROR: UnkNown procedure: {}/1
ERROR: In:
ERROR: [13] {rand(_35671298,_35671300)}
ERROR: [12] next___0__0(suspension(470241,removed,_35671332,user: ...,next)) at grid.pl:12
ERROR: [9] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
Exception: (13) {rand(_35670676,_35670678)} ? abort
% Execution Aborted
======================
这有效,但必须最后设置位置!!!并且不能使用 GUARD !
:- use_module(library(chr)).
:- chr_constraint move/2,next/0.
:- [utils].
rand(X,Y]).
next <=> move(X,rand(X,Y).
move(A,B),pos(X,Y) <=> X1 is X + A,Y1 is Y + B,X1 > 0,Y1 < 10,pos(X1,Y1).
首先生成动作!!很奇怪......每次我在 pos() 之后放置 next 时它都会失败..
?- next,next,pos(5,5).
1,0
1,1
0,0
pos(7,6).
解决方法
好像我明白了..!!在这种情况下,序言调用必须是第一个 rand() 即
next <=> rand(X,Y),move(X,Y).
除了守卫,仍然不能使用更新后的值……可能是因为它们是事后计算的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。