在Jess in Action - Java中的基于规则的系统(写于10多年前;我认为Drools是今天使用的系统?)中,Ernest Friedman-Hill使用Jess解决了下面给出的约束问题,这是一种OPS5风格用Java编写的前向链接生产系统.我想用Prolog解决它.
问题是:我能正确解决吗?
问题
四人高尔夫球手站在球座上,从左到右依次排成一条线.每个高尔夫球手都穿着不同颜色的裤子; 一个人穿着红色裤子.美联储直接右翼的高尔夫球手穿着蓝色裤子.乔排在第二位.鲍勃穿着格子裤.汤姆不在第一或第四位,他没有穿着可怕的橙色裤子.
四个高尔夫球手将以什么顺序开球,每个高尔夫球手的裤子是什么颜色的?
这是斑马拼图的一个例子.另请参阅此演示文稿,了解更复杂的解决方案.
使用Jess生产系统的代码如下.这来自上述书籍,为了清楚起见,重命名了变量.
工作记忆充满了从高尔夫球手到其可能位置和裤色的32条链接.该find-solution规则触发满足约束的链接集.
这似乎很难考虑,因为人们不会测试"可能的世界"是否满足约束条件,而是选择一组满足约束条件的链接.目前尚不清楚这确实是一个人在寻找什么.
;; Templates for working memory, basically the links golfer<->pantscolor,
;; and golfer<->position.
(deftemplate pants-color (slot of) (slot is))
(deftemplate position (slot of) (slot is))
;; Generate all possible 'pants-color' and 'position' facts
;; 4 names, each with 4 pants-color: 16 entries
;; 4 names, each with 4 positions: 16 entries
;; …Run Code Online (Sandbox Code Playgroud) 获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。
在阅读 William F. Clocksin 于 1997 年 ( WorldCat ) 的“条款和效果 - 工作程序员的序言编程”时,是一段
Prolog程序由一组过程组成。每个过程定义一个特定的谓词,作为其参数之间的某种关系。一个过程由一个或多个断言或子句组成。考虑两种条款很方便:事实 和规则。
虽然我理解所有单词,但在交流 Prolog 时,每个粗体单词是否都是当前正确使用的术语?
特别是规则的使用似乎不受欢迎。
我在结构中有一些UTF-8编码的字符串,我倾向于使用Data :: Dumper进行调试.
一个小测试案例是:
use utf8;
use Data::Dumper;
say Dumper({??=>"??"}
Run Code Online (Sandbox Code Playgroud)
它输出
{
"\x{434}\x{430}" => "\x{43d}\x{435}"
};
Run Code Online (Sandbox Code Playgroud)
但我想看
{
"??" => "??"
};
Run Code Online (Sandbox Code Playgroud)
当然,我的结构非常复杂.如何在调试时使转储结构中的字符串可读?也许我必须以chr某种方式处理输出warn/say?
长话短说:
我试图用创建/编辑GitHub Gists
问题:
要点的创建是任意的。通常,两个按钮“创建公共要领”和“创建秘密要领”仅保持禁用状态,而编辑器小部件为“无效”。
有时,创建工作正常,编辑器窗口小部件消失并显示行号,并且编辑器按钮变为活动状态。但是这种情况很少发生。
编辑要点是任意的。再次,有时它可以工作,但是目前我只得到没有光标的空白编辑器小部件。
还有其他人遇到这些问题吗?这可能是暂时的问题,或者可能是Firefox不喜欢的一些JavaScript。但是,网络搜索不会带来任何好处-我简直不敢相信我是唯一坚持这一点的人。
在 Prolog 中,传统上有两种表示字符序列的方法:
DCG 是一种编写从左到右列表处理代码的符号方式,旨在对“分解文本列表”进行解析。根据偏好,待处理的列表可以是字符列表或代码列表。但是,在写下常量时,字符/代码处理的表示法有所不同。通常以“字符样式”或“代码样式”编写 DCG 吗?或者甚至在模块导出 DCG 非终端的情况下采用字符/代码样式以实现可移植性?
'a': 一个字符(像往常一样:单引号表示一个原子,如果标记以小写字母开头,它们可以被省略。)0'a:该代码的a。['a','b']: 一个字符列表。[ 0'a, 0'b ]:列表码,即编码a和b(这样就可以避免在实际的代码点值打字)。"a"代码列表。传统上,双引号字符串被分解为代码列表,这种表示法在 DCG 上下文中也适用于 SWI-Prolog,即使 SWI-Prolog 将“双引号字符串”映射到特殊的字符串数据类型。`0123`. 传统上,反引号内的文本被映射到一个原子(我认为,95 ISO 标准只是避免对反引号字符串的含义进行具体说明。“这将是 ISO/IEC 13211 的这一部分的有效扩展到将反引号字符串定义为表示字符串常量。" )。在 SWI-Prolog 中,反引号内的文本被分解为代码 …我正在查看SICStus手册的语法描述,并且有一个"浮动"的定义.但是,没有迹象表明实际上"浮动"的实现是什么.IEEE单精度还是双精度?也许甚至是BigDecimal?
在SWI Prolog(或至少SWISH)中,"浮动"似乎是IEEE双精度,可以通过以下方式确定:
planck_float(P) :-
planck_float_descent(1.0,P).
planck_float_descent(X,P) :-
Xhalf is X / 2.0, Xtest is 1.0 + Xhalf, Xtest =\= 1.0, !,
write(Xhalf),writeln(Xtest),
planck_float_descent(Xhalf,P).
planck_float_descent(P,P) :-
Xhalf is P / 2.0, Xtest is 1.0 + Xhalf, Xtest == 1.0,
writeln(P).
?- planck_float(P).
P = 2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)
2.22e-16作为最后一个值,添加到1.0仍然产生比1.0IEEE 64位浮点算法更好的声音.
其他Prolog有什么实施方案?
在 Prolog 代码中,可以通过使用“无头”Horn 子句向编译器传递指令,这些子句与左指材料蕴涵':-' (?) 的左侧没有头部关系。例如,要导入模块或声明单元测试代码:
:- begin_tests(lists).
:- use_module(library(lists)).
test(reverse) :- reverse([a,b], [b,a]).
:- end_tests(lists).
Run Code Online (Sandbox Code Playgroud)
显然,无头 Horn 子句在源文件中的位置很重要。
喇叭条款
HEAD :- BODY1, BODY2, .... , BODYN
Run Code Online (Sandbox Code Playgroud)
被理解为等价于逻辑表达式
身体_1?身体_2?.... ? 身体_n ? 头
或者,因为这被理解为经典逻辑,使用布尔代数的等价规则:
¬body_1 ?¬body_2 ? .... ? ¬body_n ? 头
在无头子句的情况下,我们因此断言否定:
:- begin_tests(lists).
Run Code Online (Sandbox Code Playgroud)
原则上意味着我们断言这begin_tests(lists)不是真的。
(实际上,在Answer Set Programming 中,上述类型的子句用作“矛盾”以拒绝生成的解决方案::- move(D,P,T), blocked(D-1,P,T).意思是“ move(D,P,T) ?blocked(D-1,P,T)永远不是真的” ,相应地拒绝任何潜在的解决方案。)
我理解能够指定代码分隔符、源注释、文件元信息和其他编译器指令的实际需求。但是为什么指令使用:-. 使用一些与逻辑语法完全无关的其他符号,例如#C 宏传统上使用的符号,会不会更干净。
那么,写为||运算符的“条件或”(也称为“短路或”)如何在 R 中工作?
查询?Logic显示:
& 和 && 表示逻辑 AND 和 | 和 || 表示逻辑或。较短的形式以与算术运算符大致相同的方式执行元素比较。较长的形式从左到右求值,仅检查每个向量的第一个元素。评估仅在结果确定之前进行。较长的形式适用于编程控制流,通常首选在 if 子句中。
听起来很标准。
> library(dplyr)
> as_tibble(mtcars) %>% filter(between(hp,50,70))
# A tibble: 5 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
2 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
3 …Run Code Online (Sandbox Code Playgroud) 如果有的话,结果和执行有何不同?
memb(X, [Y,L]) :- X == Y ; memb(X,L).
Run Code Online (Sandbox Code Playgroud)
和
memb(X, [Y,L]) :- X == Y.
memb(X, [Y,L]) :- memb(X,L).
Run Code Online (Sandbox Code Playgroud) 我很困惑number.它似乎是一个类型,类似于超类型,Int和java.lang.NumberFloat一样,但是:
number.注意:
> 1024
1024 : number
> 1024.0
1024 : Float
> floor(1024)
1024 : Int
Run Code Online (Sandbox Code Playgroud)
我们使用一个值名称number:
> number = 144
144 : number
> number
144 : number
> number = floor(144)
144 : Int
> number
144 : Int
Run Code Online (Sandbox Code Playgroud)
并且:
> Result.Ok 12
Ok 12 : Result error number
> Result.Ok 12.0
Ok 12 : Result error Float
> Result.Ok (floor 12)
Ok 12 …Run Code Online (Sandbox Code Playgroud) prolog ×6
iso-prolog ×2
data-dumper ×1
dcg ×1
debugging ×1
elm ×1
firefox ×1
github ×1
perl ×1
r ×1
terminology ×1
types ×1
unicode ×1
utf-8 ×1
zebra-puzzle ×1