小编Wou*_*eek的帖子

逻辑编程和函数编程之间的区别

我一直在阅读许多文章试图理解功能和逻辑编程之间的区别,但到目前为止我能够做出的唯一推论是逻辑编程通过数学表达式定义程序.但是这样的事情与逻辑编程无关.

我真的很感激功能和逻辑编程之间的差异.

haskell functional-programming prolog

68
推荐指数
4
解决办法
3万
查看次数

使用Git复制子模块

我在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)

git git-submodules

21
推荐指数
2
解决办法
2737
查看次数

如何在Emacs的org-mode中使formule更大?

我发现Org-mode + LaTeX是一个非常好的工具.我怎样才能改变公式的规模?目前它对我来说太小了.我知道如何缩放Emacs font(C-x+),但这对LaTeX公式不起作用.

如何在Org模式下使LaTeX公式更大?

我已经厌倦了改变一些参数,但问题仍然存在.

感谢您的耐心等待!

emacs latex org-mode

19
推荐指数
1
解决办法
4917
查看次数

是否有Prolog的包管理器?

我想知道与其他程序员共享Prolog代码/库的最佳实践(以及多个项目之间的自己).我自己也在使用SWI-Prolog,但也对其他Prolog如何解决这个问题感兴趣.

相比之下,Java有Maven + JAR,Python有EasyInstall + PythonEggs,其他语言可能还有很多其他语言.但Prolog还有吗?

SWI-Prolog包

在SWI-Prolog中有Packs,由模块支持library(prolog_pack).这些的缺点是:

  1. 您必须为每个包创建存档文件或Git存储库.说我想创建10包.现在我需要创建10个Git存储库.我有时会编辑影响多个文件,可能驻留在多个包/ repos中,要求我为单个(多文件)编辑提交几个Git存储库.
  2. 为了创建一个包,你必须手工挑选一些"属于一起"的文件.有时候我发现文件X属于包A和包B.现在我需要在存储库A和B中维护文件X的副本,或者我需要创建另一个包C只包含X和导入C到A和B.
  3. 包在公共网站上发布.我的大部分图书馆对我来说都很有趣.其中一些对我与之合作的特定人员很有意思,只有少数人准备好进行更广泛/公开的传播.
  4. 包维护者必须指定包间依赖关系.对于复杂的图书馆等级,对我来说似乎是不必要的工作.我已经非常严格地使用Prolog模块,并且只想使用Prolog模块导入的层次结构作为依赖图.

Git子模块

另一种我直到现在使用过的方法是Git子模块.通过将一个存储库导入另一个存储库来实现库之间的依赖关系.这与SWI-Prolog包有一些相同的缺点:

  1. 每个库的Git存储库,因此需要维护大量存储库.
  2. 维护者必须明智地选择每个repo的文件,并且必须指定需要哪些Git子模块包含.
  3. 更新现有库非常困难.我发现(困难的方法)我交给代码的大多数人都无法成功更新具有许多错综复杂的相互依赖的子模块导入的Git存储库.(我非常尊重偶尔使用子模块的Git大师并且总是把它做对,但是大多数非程序员和我工作的很多程序员都觉得它太难了.)

我的理想方法

我个人对完美的Prolog代码共享方法的偏好是:

  1. 您传播的库的数量和您拥有的Git存储库的数量是独立的.具体来说,我可以有一个相当大的存储库,其中的一部分以不同的方式传播.如果有人喜欢(重新)使用我的Prolog模块和DCG帮助器谓词,那么我可以简单地向该人传播该单个文件(加上潜在的依赖关系).
  2. 您不必亲自挑选和手动复制单个文件,而是让算法遍历模块导入的层次结构以提取(显然)属于一起的文件.首次运行程序时会下载文件.这些文件可能都属于同一个Git存储库或多个存储库,算法根本不关心存储库和库之间或存储库和文件之间的映射.
  3. 代码的维护者能够决定一个库是公开发布还是发布给有限的一组人(或者只限于包括维护者在内的有限组).
  4. 文件之间的模块导入层次结构是依赖关系跟踪所需的全部内容.

以上暗示我理想的库共享方法是基于文件的,而不是基于包的.如果Prolog模块A使用Prolog模块B并且加载了A,则从本地文件(如果存在)加载B或从存储库下载B. 我不确定基于文件的方法在其他语言中有多常见.前面提到的Maven + JAR和EasyInstall + PythonEggs都是基于包的.

我对其他Prolog程序员使用和思考这个主题非常感兴趣!

module package-managers prolog swi-prolog git-submodules

9
推荐指数
1
解决办法
453
查看次数

在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 …

coding-style deterministic prolog

7
推荐指数
1
解决办法
225
查看次数

由于**和^的运算符优先级不同而导致的轻微不一致

为什么**/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)

prolog operator-precedence iso-prolog

7
推荐指数
1
解决办法
138
查看次数

如何在Prolog中用变量一致地替换原子?

我正在使用DCG为SPARQL(语义Web查询语言)编写解析器.我想用Prolog变量替换SPARQL变量名.我该怎么做?

我可以使用生成新变量length([NewVar], 1),但我无法通过简单地使用名称变量对列表来跟踪现有的赋值.一个member/2名单上的操作会返回一个新的变量,而不是一个存储在列表中.

有没有简单的方法在Prolog中命名变量,例如'$VAR(Name)'

variables naming prolog

7
推荐指数
1
解决办法
681
查看次数

将 R 图导出为多种格式

既然可以将 R 图导出为 PDF PNGSVG 等,是否也可以将 R 图一次性导出为多种格式?例如,将绘图导出为 PDF PNGSVG 而无需重新计算绘图?

graphics plot r

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

如何修复 Clang Tidy 中的 llvmlibc-restrict-system-libc-headers 检查?

我不明白llvmlibc-restrict-system-libc-headersClang Tidy 中的检查(链接)。

我在 C++ 代码中包含 C 库,如下所示:

#include <cstddef>
Run Code Online (Sandbox Code Playgroud)

我应该更改什么来修复此 Clang Tidy 检查?它应该被修复吗?

c++ libc llvm clang clang-tidy

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

在列表成员实例化时不会传播约束

我正在为日期和时间构建解析器和生成器.在普通的编程语言中,这些将分开编写.在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)

parsing prolog clpfd

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

'范围:设置(键,值)'和'设置(范围:键,值)'之间的区别

在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

module prolog setting swi-prolog

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

如何在JSON-LD中返回SPARQL结果?

什么是以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)

json sparql json-ld

3
推荐指数
1
解决办法
1902
查看次数

如何将数据传输到 rapper(Redland 的命令行 RDF 解析器)

如何将数据传输到 rapper(Redland 的命令行 RDF 解析器)?以下不起作用:

curl "http://download.lodlaundromat.org/85d5a476b56fde200e770cefa0e5033c" | gunzip | rapper
Run Code Online (Sandbox Code Playgroud)

rdf pipe redland

2
推荐指数
1
解决办法
207
查看次数