- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一门好的逻辑编程语言应该允许程序员使用与数学家使用的语言接近的语言。因此,我一直认为Prolog中缺乏适当的全称量词是一个重要的缺点。
今天我想到了如何定义比 forall
和 foreach
更好的东西。
forany(Var, {Context}, Condition, Body)
此谓词试图证明所有实例化的 Body
Var
在 Condition
上连续回溯。 Condition
和 Body
中的所有变量都被视为本地变量,除非在 Var
或 Context
中列出。 Condition
不允许以任何方式修改 Context
中列出的变量,否则 forany
将无法正常工作。
这是实现(基于yall):
forany(V, {Vars}, Goal1, Goal2) :-
( bagof(V, {V,Vars}/Goal1, Solutions)
-> maplist({Vars}/[V]>>Goal2, Solutions)
; true ).
我的第一个问题是关于 forany
的第二个参数。我想消除它。
构建前 8 个方格的列表:
?- length(X,8), forany(N, {X}, between(1,8,N),
(Q is N*N, nth1(N, X, Q))).
X = [1, 4, 9, 16, 25, 36, 49, 64].
反转列表:
?- X=[1,2,3,4,5], length(X,N), length(Y,N),
forany(I, {X,Y,N}, between(1,N,I),
(J is N-I+1, nth1(I,X,A), nth1(J,Y,A))).
X = [1, 2, 3, 4, 5],
N = 5,
Y = [5, 4, 3, 2, 1].
子集:
subset(X, Y) :- forany(A, {X,Y}, member(A,X), member(A, Y)).
一种生成列表所有排列且不重复的有趣方法:
permutation(X, Y) :-
length(X, N), length(Y, N), subset(X, Y).
?- permutation([1,2,3],X).
X = [1, 2, 3] ;
X = [1, 3, 2] ;
X = [2, 1, 3] ;
X = [2, 3, 1] ;
X = [3, 1, 2] ;
X = [3, 2, 1] ;
false.
一种对不同整数列表进行排序的有趣方法。请注意,约束用于对列表进行排序,因此不会生成大多数排列:
sorted(X) :- forany(A-B, {X}, append(_, [A,B|_], X),
A#<B).
?- X=[7,3,8,2,6,4,9,5,1], length(X, N), length(Y, N),
sorted(Y), subset(X,Y).
X = [7, 3, 8, 2, 6, 4, 9, 5, 1],
N = 9,
Y = [1, 2, 3, 4, 5, 6, 7, 8, 9] .
看起来这个forany
在不使用约束时工作得非常出色。此外,它还可以用于生成约束,但至少在 SWI-Prolog 上,当已经生成约束时会出现问题。原因是forany
使用了bagof
,根据SWI-Prolog的手册:
Term-copying operations (
assertz/1
,retract/1
,findall/3
,copy_term/2
, etc.) generally also copy constraints. The effect varies from ok, silent copying of huge constraint networks to violations of the internal consistency of constraint networks. As a rule of thumb, copying terms holding attributes must be deprecated. If you need to reason about a term that is involved in constraints, usecopy_term/3
to obtain the constraints as Prolog goals, and use these goals for further processing.
这里演示了 bagof
使用约束创建的问题:
?- X=[A,B,C], dif(C,D), bagof(_, K^member(K,X), _).
X = [A, B, C],
dif(C, _5306),
dif(C, _5318),
dif(C, _5330),
dif(C, D).
如您所见,创建了三个不必要的约束。
我的第二个问题是这是否只是 SWI-Prolog 的问题。
第三个问题:有没有办法在 SWI-Prolog 中解决这个问题。手册中的上述引用表明应使用 copy_term/3
。不幸的是,我不理解这个建议,也不知道它对 forany
是否有用。
最佳答案
好消息!让我惊讶的是 bagof
是用 Prolog 编写的。通过查看它的代码,我了解到一些我认为不可能的事情实际上是可能的。正如 SWI-Prolog 手册所建议的那样,copy_term/3
或者类似的谓词 copy_term_nat/2
有所帮助。
因此,我非常高兴能够为 SWI-Prolog 提供一个完全有效的(据我所知)通用量词:
forany(V, {Vars}, Condition, Body) :-
findall(V-Vars, Condition, Solutions),
% For SWI-Prolog. Can be replaced by Solutions=Clean_solutions in other systems
copy_term_nat(Solutions, Clean_solutions),
forany_execute_goals(Clean_solutions, Vars, V, Body).
forany_execute_goals([], _, _, _).
forany_execute_goals([Sol-NewVars|Solutions], Vars, V, Body) :-
% The following test can be removed
assertion(subsumes_term(NewVars, Vars)),
% or replaced by the following more standard use of throw/1:
% ( subsumes_term(NewVars, Vars)
% -> true
% ; throw('Forbidden instantiation of context variables by the antecedent of forany') ),
NewVars = Vars,
call({Vars}/[V]>>Body, Sol),
forany_execute_goals(Solutions, Vars, V, Body).
关于prolog - Prolog 中的无损通用量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971608/
我正在寻找一个专门用于进一步压缩Jpeg而不改变图像的库。我找到了PackJpeg,但它不提供任何源代码,并且您不允许在商业上使用它。 最佳答案 在PackJPG page上,有一个指向JPEG Op
对于我的视频隐写项目(java),我需要将连续的 PNG 编码到电影文件中。我尝试了xuggler,但我得到了压缩。(由于隐藏在png图像的LSB中的数据在下次我从视频中提取帧时会丢失) 因为我需要稍
我想根据一个或多个模型的属性来过滤 Backbone 集合。我已经阅读了这个问题,我注意到讨论最多的解决方案是简单地使用 this.where({"applicationType": applicat
有没有办法使用 Python 或使用命令行无损将 PDF 旋转 90 度? 我正在寻找真正的旋转,而不仅仅是在 PDF 中添加“/ROTATE 90”,因为之后我必须通过 Hylafax 发送 PDF
我目前正在尝试在 FFMPEG 上使用 H264 对 RGB24 文件进行无损压缩。但是,H264 压缩(RGB24 -> YUV444)中使用的色彩空间转换已被证明是有损的(我猜测是由于量化误差)。
我目前正在处理无损 JPEG 文件(不是 JPEG-LS)。很难找到任何文件来测试我的应用程序。 特别是我需要包含重置间隔标记、多个 DC 霍夫曼表、多个场景或注释标记的文件。 你知道我在哪里可以找到
我正在尝试无损压缩图像,为了利用规律性,我想将图像从 RGB 转换为 Y'CbCr。 (我所说的 RGB 和 Y'CbCr 的具体细节在这里并不重要;RGB 数据由三个字节组成,我有三个字节来存储结果
我正在尝试仅使用 JavaScript 和 HTML5 自己创建 DICOM 查看器。最近几天我一直在研究这个项目,现在我成功解析了我需要的所有文本信息,并且我还可以正确读取和显示未压缩的灰度和 RG
Google 的 PageSpeed 工具告诉我优化我的 PNG 图像,这些图像在 Photoshop 中保存用于网络。在研究了无损 PNG 压缩选项后,我下载了 ImageOptim 并通过它放了一
我需要压缩视频流以通过网络将其从 C++ 库传输到 Java 平台 (Android) 并在那里解压缩。要求如下: 该库必须可用于 Android 平台和 C++(或者,2 个使用通用格式的独立库)
使用 ffmpeg h264(无损)编码/解码视频的见解 所以我在编码部分做了一些工作,用 264 编码一个 avi,但是 VLC 不会播放它,但是 Totem 会。解码同一个文件证明很麻烦。 (我想
我是一名优秀的程序员,十分优秀!