prolog - 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,2,Y), say("~w,~w",[X,Y]).
pos(X,Y), 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,Y), {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,0,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,pos/2, next/0.
:- [utils].
rand(X,Y) :- random(0,2,X), random(0,2,Y), say("~w,~w",[X,Y]).
next <=> move(X,Y), rand(X,Y).
move(A,B),pos(X,Y) <=> X1 is X + A, Y1 is Y + B , X1 > 0, X1 < 10, Y1 > 0, Y1 < 10, pos(X1,Y1).
首先生成动作!很奇怪......任何时候我在 pos() 之后放置 next 都会失败..
?- next,next,next,pos(5,5).
1,0
1,1
0,0
pos(7, 6).
解决方案
好像我明白了..!! 在这种情况下,序言调用必须是第一个 rand() 即
next <=> rand(X,Y), move(X,Y).
除了守卫,仍然不能使用更新的值......可能是因为它们是事后计算的。
推荐阅读
- python - Dataframe - get most frequent values and their count
- c# - .NET Core 3.0 中的 GraphQL.Net 库出现“INVALID_OPERATION”错误
- reactjs - 从功能显示卡片组件的问题 [React-Bootstrap]
- javascript - 如何修复预期在反应函数组件结束时返回值的 linter?
- javascript - 变色按钮onclick
- .net-core - .Net Core 依赖注入手动处理使用 implementationFactory Func 创建的对象
- python - Selenium 多文件上传 + Python
- python - 设置结果后,asyncio Future 无限期挂起
- java - 如何使用 Java、Spring boot 读取包含 150K 记录的 excel 文件、验证、持久化 DB 中的行?
- r - 更改示例/虚构数据集中两个变量之间的相关性