我一直在阅读许多文章试图理解功能和逻辑编程之间的区别,但到目前为止我能够做出的唯一推论是逻辑编程通过数学表达式定义程序.但是这样的事情与逻辑编程无关.
我真的很感激功能和逻辑编程之间的差异.
我在Git中有一个包含多个子模块的项目,我需要下载这些子模块以及可用的文件以便使用主项目,并且为了使子模块工作,我需要自己的子模块可用等等.所以为此设置我使用递归初始化子模块git submodule update --init --recursive.
但是,我注意到我的许多子模块都有共享依赖关系,在伪代码中看起来像这样(alpha -> beta表示alpha具有子模块beta)
my project -> submodule a -> submodule m
-> submodule b -> submodule m
-> submodule n -> submodule x
-> submodule c -> submodule x
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法只使用git来避免这种重复,同时仍然拥有每个子模块的文件(至少有一个副本)?
我可以想象一个带符号链接的解决方案,但如果git为我处理这个问题会更好,而且我不确定在更新子模块时自己输入符号链接是否会引起问题.
理想情况下,我希望将其简化为:
my project -> submodule a -> symlink(submodule m)
-> submodule b -> symlink(submodule m)
-> symlink(submodule n)
-> submodule c -> symlink(submodule x)
-> submodule m
-> submodule n -> symlink(submodule x)
-> submodule x …Run Code Online (Sandbox Code Playgroud) 我发现Org-mode + LaTeX是一个非常好的工具.我怎样才能改变公式的规模?目前它对我来说太小了.我知道如何缩放Emacs font(C-x+),但这对LaTeX公式不起作用.
如何在Org模式下使LaTeX公式更大?
我已经厌倦了改变一些参数,但问题仍然存在.
感谢您的耐心等待!
我想知道与其他程序员共享Prolog代码/库的最佳实践(以及多个项目之间的自己).我自己也在使用SWI-Prolog,但也对其他Prolog如何解决这个问题感兴趣.
相比之下,Java有Maven + JAR,Python有EasyInstall + PythonEggs,其他语言可能还有很多其他语言.但Prolog还有吗?
在SWI-Prolog中有Packs,由模块支持library(prolog_pack).这些的缺点是:
另一种我直到现在使用过的方法是Git子模块.通过将一个存储库导入另一个存储库来实现库之间的依赖关系.这与SWI-Prolog包有一些相同的缺点:
我个人对完美的Prolog代码共享方法的偏好是:
以上暗示我理想的库共享方法是基于文件的,而不是基于包的.如果Prolog模块A使用Prolog模块B并且加载了A,则从本地文件(如果存在)加载B或从存储库下载B. 我不确定基于文件的方法在其他语言中有多常见.前面提到的Maven + JAR和EasyInstall + PythonEggs都是基于包的.
我对其他Prolog程序员使用和思考这个主题非常感兴趣!
在Prolog中编程时,我经常编写谓词,当所有参数被实例化时,其行为应该是半确定性的(否则其行为应该是非确定性的).
一个具体的用例就是我的谓词walk/3,它实现了图形遍历.由于两个顶点之间可以存在多条路径,因此实例化后(+,+)会给出多个选择点true.然而,这些都是无用的.once/1出于性能原因,必须明确使用调用代码.
%! walk(+Graph:ugraph, +StartVertex, +EndVertex) is semidet.
%! walk(+Graph:ugraph, -StartVertex, +EndVertex) is nondet.
%! walk(+Graph:ugraph, +StartVertex, -EndVertex) is nondet.
%! walk(+Graph:ugraph, -StartVertex, -EndVertex) is nondet.
Run Code Online (Sandbox Code Playgroud)
半决定论可以通过once/1在调用上下文中使用来强制,但我想将半决定论作为谓词的属性来实现walk/3,而不是每次被调用时都需要特别对待的东西.
除了对代码美学的关注之外,调用上下文不必总是知道它的调用是否walk/3是半确定性的.例如:
%! cycle(+Graph:ugraph, +Vertex) is semidet.
%! cycle(+Graph:ugraph, -Vertex) is nondet.
cycle(Graph, Vertex):-
walk(Graph, Vertex, Vertex).
Run Code Online (Sandbox Code Playgroud)
我提出了以下解决方案,它确实产生了正确的行为.
walk_wrapper(Graph, Start, End):-
call_ground_as_semidet(walk(Graph, Start, End)).
:- meta_predicate(call_ground_as_semidet(0)).
call_ground_as_semidet(Goal):-
ground(Goal), !,
Goal, !.
call_ground_as_semidet(Goal):-
Goal.
Run Code Online (Sandbox Code Playgroud)
但是,这种解决方案存在不足之处:
ground应该是nonvar …为什么**/2(xfx)和(^)/2(xfy)的参数优先级在Prolog中不一样?
这会导致轻微的不一致,例如:
?- X = 1, Y is 1 ^ -X.
X = Y, Y = 1.
Run Code Online (Sandbox Code Playgroud)
和:
?- Y is 1 ** -1.
Y = 1.
Run Code Online (Sandbox Code Playgroud)
但:
?- X = 1, Y is 1 ** -X.
ERROR: Syntax error: Operator priority clash
ERROR: X = 1, Y is 1 *
ERROR: ** here **
ERROR: * -X .
Run Code Online (Sandbox Code Playgroud) 我正在使用DCG为SPARQL(语义Web查询语言)编写解析器.我想用Prolog变量替换SPARQL变量名.我该怎么做?
我可以使用生成新变量length([NewVar], 1),但我无法通过简单地使用名称变量对列表来跟踪现有的赋值.一个member/2名单上的操作会返回一个新的变量,而不是一个存储在列表中.
有没有简单的方法在Prolog中命名变量,例如'$VAR(Name)'?
既然可以将 R 图导出为 PDF 、 PNG或SVG 等,是否也可以将 R 图一次性导出为多种格式?例如,将绘图导出为 PDF 、 PNG和SVG 而无需重新计算绘图?
我不明白llvmlibc-restrict-system-libc-headersClang Tidy 中的检查(链接)。
我在 C++ 代码中包含 C 库,如下所示:
#include <cstddef>
Run Code Online (Sandbox Code Playgroud)
我应该更改什么来修复此 Clang Tidy 检查?它应该被修复吗?
我正在为日期和时间构建解析器和生成器.在普通的编程语言中,这些将分开编写.在Prolog + CLP(FD)中我可以编写1个谓词同时执行这两个操作:-)
在我的用例中,解析多个数字并将其转换为整数或根据给定的整数生成多个数字通常是有意义的.
我的问题是,clpfd:run_propagator/2在实例化个别数字时不会调用,尽管我的声明使用了clpfd:init_propagator/2.有没有办法做到这一点,还是我在定义中犯了错误clpfd_digits/2?
在SWI-Prolog中实施的代码:
:- use_module(library(apply)).
:- use_module(library(clpfd)).
:- multifile(clpfd:run_propagator/2).
day(D) --> {clpfd_digits(D, [D1,D2])}, digit(D1), digit(D2).
digit(D) --> [C], {code_type(C, digit(D))}.
clpfd_digits(N, Ds):-
clpfd:make_propagator(clpfd_digits(N, Ds), Prop),
clpfd:init_propagator(N, Prop),
clpfd:init_propagator(Ds, Prop),
forall(
member(D, Ds),
clpfd:init_propagator(D, Prop)
),
clpfd:trigger_once(Prop).
clpfd:run_propagator(clpfd_digits(N, Ds), MState):-
( maplist(is_digit0, Ds)
-> clpfd:kill(MState),
digits_to_nonneg(Ds, N)
; integer(N)
-> clpfd:kill(MState),
nonneg_to_digits(N, Ds)
; true
).
digits_to_nonneg([], 0):- !.
digits_to_nonneg(Ds, N):-
maplist(char_weight, Chars, Ds),
number_chars(N, Chars).
char_weight(Char, D):-
char_type(Char, digit(D)).
nonneg_to_digits(0, []):- …Run Code Online (Sandbox Code Playgroud) 在SWI-Prolog的设置库中,以下内容之间是否有不同之处:
scope:set_setting(Key, Value) 和 set_setting(scope:Key, Value)scope:setting(Key, Value) 和 setting(scope:Key, Value):- scope:setting(Key, Type, Default, Doc) 和 :- setting(scope:Key, Type, Default, Doc)另外:除了和当前加载的模块名称可以scope是什么user?
什么是以JSON-LD返回SPARQL查询结果的最佳方法,最好保持在标准化JSON格式附近?是否可以为每个查询或仅针对某些查询类型返回JSON-LD?
JSON格式的SPARQL查询结果示例(即,不进行JSON-LD扩展):
{
"head": {"vars": ["s", "p", "o" ]},
"results": {
"bindings": [
{
"s": {
"type":"uri",
"value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
},
"p": {
"type":"uri",
"value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
},
"o": {
"type":"uri",
"value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud) 如何将数据传输到 rapper(Redland 的命令行 RDF 解析器)?以下不起作用:
curl "http://download.lodlaundromat.org/85d5a476b56fde200e770cefa0e5033c" | gunzip | rapper
Run Code Online (Sandbox Code Playgroud)