小编Dav*_*fer的帖子

Rosencrantz夫人的Jess查询(斑马拼图)在Prolog中表达

Jess in Action - Java中的基于规则的系统(写于10多年前;我认为Drools是今天使用的系统?)中,Ernest Friedman-Hill使用Jess解决了下面给出的约束问题,这是一种OPS5风格用Java编写的前向链接生产系统.我想用Prolog解决它.

问题是:我能正确解决吗?

问题

四人高尔夫球手站在球座上,从左到右依次排成一条线.每个高尔夫球手都穿着不同颜色的裤子; 一个人穿着红色裤子.美联储直接右翼的高尔夫球手穿着蓝色裤子.乔排在第二位.鲍勃穿着格子裤.汤姆不在第一或第四位,他没有穿着可怕的橙色裤子.

四个高尔夫球手将以什么顺序开球,每个高尔夫球手的裤子是什么颜色的?

这是斑马拼图的一个例子.另请参阅此演示文稿,了解更复杂的解决方案.

使用Jess,作者:Ernest Friedman-Hill

使用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)

prolog zebra-puzzle

6
推荐指数
1
解决办法
299
查看次数

这个 Prolog 术语是否正确?(事实、规则、程序、谓词……)

获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。

在阅读 William F. Clocksin 于 1997 年 ( WorldCat ) 的“条款和效果 - 工作程序员的序言编程”时,是一段

Prolog程序由一组过程组成。每个过程定义一个特定的谓词,作为其参数之间的某种关系。一个过程由一个或多个断言子句组成。考虑两种条款很方便:事实规则

虽然我理解所有单词,但在交流 Prolog 时,每个粗体单词是否都是当前正确使用的术语?

特别是规则的使用似乎不受欢迎。

terminology prolog iso-prolog

6
推荐指数
1
解决办法
1413
查看次数

如何使用Data :: Dumper显示可读的UTF-8字符串?

我在结构中有一些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

debugging unicode perl utf-8 data-dumper

6
推荐指数
1
解决办法
701
查看次数

GitHub Gist创建和编辑在Firefox中不起作用?

长话短说:

我试图用创建/编辑GitHub Gists

  • Windows 10上的Firefox 67.0
  • Linux Fedora上的Firefox 67.0
  • 附加组件:NoScript,Ghostery,LastPass
  • 在禁用NoScript和Ghostery的情况下进行了尝试,并且在“全部屏蔽”模式下使用了NoScript,并且在“安全模式”下也使用了Firefox。

问题:

要点的创建是任意的。通常,两个按钮“创建公共要领”和“创建秘密要领”仅保持禁用状态,而编辑器小部件为“无效”。

要点编辑器已死,无法创建

有时,创建工作正常,编辑器窗口小部件消失并显示行号,并且编辑器按钮变为活动状态。但是这种情况很少发生。

编辑要点是任意的。再次,有时它可以工作,但是目前我只得到没有光标的空白编辑器小部件。

还有其他人遇到这些问题吗?这可能是暂时的问题,或者可能是Firefox不喜欢的一些JavaScript。但是,网络搜索不会带来任何好处-我简直不敢相信我是唯一坚持这一点的人。

firefox github

6
推荐指数
1
解决办法
163
查看次数

应该编写文本处理 DCG 来处理代码还是字符?或两者?

在 Prolog 中,传统上有两种表示字符序列的方法:

  • 作为字符列表,它们是长度为 1 的原子。
  • 作为代码列表,它们只是整数。整数将被解释为代码点,但未指定要应用的约定。作为一个(非常理智的)例子,在 SWI-Prolog 中,代码点的空间是Unicode(因此,大致上,代码点整数范围从 0 到 0x10FFFF)。

DCG 是一种编写从左到右列表处理代码的符号方式,旨在对“分解文本列表”进行解析。根据偏好,待处理的列表可以是字符列表或代码列表。但是,在写下常量时,字符/代码处理的表示法有所不同。通常以“字符样式”或“代码样式”编写 DCG 吗?或者甚至在模块导出 DCG 非终端的情况下采用字符/代码样式以实现可移植性?

有些研究

以下符号可用于表示 DCG 中的常数

  • 'a': 一个字符(像往常一样:单引号表示一个原子,如果标记以小写字母开头,它们可以被省略。)
  • 0'a:该代码a
  • ['a','b']: 一个字符列表。
  • [ 0'a, 0'b ]:列表,即编码ab(这样就可以避免在实际的代码点值打字)。
  • "a"代码列表。传统上,双引号字符串被分解为代码列表,这种表示法在 DCG 上下文中也适用于 SWI-Prolog,即使 SWI-Prolog 将“双引号字符串”映射到特殊的字符串数据类型。
  • `0123`. 传统上,反引号内的文本被映射到一个原子(我认为,95 ISO 标准只是避免对反引号字符串的含义进行具体说明。“这将是 ISO/IEC 13211 的这一部分的有效扩展到将反引号字符串定义为表示字符串常量。" )。在 SWI-Prolog 中,反引号内的文本被分解为代码 …

prolog dcg

6
推荐指数
1
解决办法
208
查看次数

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有什么实施方案?

floating-point prolog iso-prolog

5
推荐指数
1
解决办法
451
查看次数

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 宏传统上使用的符号,会不会更干净。

prolog

5
推荐指数
1
解决办法
610
查看次数

写成 `||` 运算符的“条件或”(也称为“短路或”)如何在 R 中工作?

那么,写为||运算符的“条件或”(也称为“短路或”)如何在 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)

r

5
推荐指数
1
解决办法
132
查看次数

使用“或”运算符和使用多个子句有什么区别吗?

如果有的话,结果和执行有何不同?

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)

prolog

5
推荐指数
1
解决办法
76
查看次数

什么是榆树的"数字"

我很困惑number.它似乎是一个类型,类似于超类型,Intjava.lang.NumberFloat一样,但是:

  • 它是用小写编写的,因此在语法上类似于值的名称(我使用'value'来避免使用名称'常量变量')
  • 实际上可以声明一个名为的值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)

types elm

4
推荐指数
1
解决办法
262
查看次数