标签: swi-prolog

从标准输入中解析

如何解析标准输入(不缓冲)?如果我理解正确,phrase/2需要一个列表,并phrase_from_file/2library(pure_input)需要一个文件.

我使用普通谓词(不是DCG)和使用类似get_char/2和的内置函数解决了我的问题read_line_to_codes/2,但最后实现看起来与我在C中编写的解决方案非常相似.

如果我能偷偷摸摸一个非常相关的问题:什么是SWI-Prolog的标准输入?read_line_to_codes(library(readutil))需要一个输入流(get/1例如,不像).我用以下谓词得到它:

input_stream(Stream) :-
    current_stream(Object, read, Stream),
    integer(Object).
Run Code Online (Sandbox Code Playgroud)

...这当然有效,但感觉有点黑客攻击.是否可以有多个开放输入流?我怎么知道哪一个是操作系统的标准输入(在我的情况下是Linux)?

prolog swi-prolog

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

如何将SWI Prolog与Visual Studio 2012连接起来

我有一个程序在Visual Studio中连接SWI-Prolog.以前,我使用VS2010(XP),一切正常.然后我升级我的VS成为VS2012(Win7),现在我的代码有问题.

说到以下代码:

PlEngine.Initialize(param);
Run Code Online (Sandbox Code Playgroud)

它总是给我以下异常消息:

The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)

任何人都可以发现我犯了什么错误,或者如果可能的话,我需要做一些修改,因为升级过程?

有关我的代码的其他信息:

  • 我使用了最新的swiPLCs库(版本:1.1.60301.0)
  • 我上面代码中的'param'是:string [] param = {" - q"," - f",@"c:\ program files(x86)\ pl \"};
  • 我已将路径环境变量设置为:c:\ program files(x86)\ pl \和c:\ program files(x86)\ pl\bin
  • 我在我的代码中有这个设置:Environment.SetEnvironmentVariable("SWI_HOME_DIR",Global.g_prologLocation);
  • 我有参考:swiPLcs.dll
  • 我已经尝试使用SWIProlog 64位,但我仍然遇到同样的问题

任何帮助都非常感谢.

非常感谢

c# prolog swi-prolog interfacing

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

流程推理/ prolog中的反应式编程?

我想知道你是否知道使用prolog进行流处理的任何方法,即某种反应式编程,或者至少让查询在不断更新的知识库上运行(实际上是一个流),并且连续输出推理的输出?

流行的"prologs"中实现了什么,比如SWI-prolog?

stream prolog swi-prolog reactive-programming

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

SWI-prolog 内存上传文件

我有一个问题,我遵循了本教程,但是当我上传文件时,它会保留在内存中并且永远不会被释放。

我使用swi-prolog 6.6.6并尝试使用swi-prolog 7.1.36

我该怎么做才能释放内存?

http swi-prolog

6
推荐指数
0
解决办法
69
查看次数

swi-prolog 中的多线程有一点改进

我有一个执行繁重计算的代码:pred(In, Out)假设执行64K 次,每次执行需要 1-10 秒。

我想使用多线程(64)机器来加快进程。我concurrent_maplist为此使用:

concurrent_maplist(pred, List_of_64K_In, List_of_64K_Out).

我得到了大约 8 倍的加速,但不会超过这个速度。我认为原因是以下通知concurrent_maplist

请注意,此谓词的开销相当大,因此在达到加速之前,目标必须相当昂贵。

为了使目标相当昂贵,我将代码修改为:

% putting 1K pred/2 in heavy_pred/2 
concurrent_maplist(heavy_pred, List_of_64_List_of_1k_In, List_of_64_List_of_1k_Out).

heavy_pred(List_of_In, List_of_Out) :-
  maplist(pred, List_of_In, List_of_Out).
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是(对我而言),我没有进一步加快这种变化。

我想知道如何通过多线程进一步加快速度?

一些额外的细节

架构:x86_64, AMD, 14.04.1-Ubuntu

swipl -v: SWI-Prolog version 6.6.4 for amd64.

pred/2 是一个定理证明器,它采用公式并试图证明它们。它采用标准的谓词很少非标准的:cyclic_term/1write/1copy_term/2等。

multithreading prolog swi-prolog

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

在SWI-prolog中定义包括竖线(|)的运算符

我试图在Prolog中编码基本的逻辑推理,我想定义一些自定义运算符来简化表示法.如果我能|-为⊢ 打字,那将会很方便.所以我试过了

:- op(1150, xfy, [ '|-' ]).
gamma |- a.
Gamma |- or(A,_) :- Gamma |- A.
Gamma |- or(_,A) :- Gamma |- A.
Run Code Online (Sandbox Code Playgroud)

但是当我尝试查询时gamma |- or(a,X),我收到错误消息

ERROR: '<meta-call>'/1: Undefined procedure: gamma/0

而不是true我期望的.

问题似乎是定义的运算符包括垂直条形字符.如果我将知识库修改为

:- op(1150, xfy, [ imp ]).
gamma imp a.
Gamma imp or(A,_) :- Gamma imp A.
Gamma imp or(_,A) :- Gamma imp A.
Run Code Online (Sandbox Code Playgroud)

然后Prolog在回答查询时没有问题gamma imp or(a,X).垂直条是保留字符,我不允许在定义中使用吗?或者有什么方法可以解决这个问题?

operators prolog swi-prolog

6
推荐指数
2
解决办法
598
查看次数

优化 CLPFD 性能(累积、global_cardinality)

我编写了一些谓词来解决大型调度问题,它们运行良好,但我希望它们具有更好的性能。我运行过profile/1,我看到与 CLPFD 相关的谓词占用了 99% 的时间。特别是garbage_collect- 它需要 37% 的执行时间。

现在,我能做什么?我的代码并不是特别复杂,它使用了很多cumulative/2和一些global_cardinality/2,除此之外没有什么特别的。我已经为labeling/1(ff, ffc, bisect)尝试了一些不同的选项,但没有区别(实际上,bisect 让事情变得更糟)。我试过用set_prolog_stack/2(全局限制、局部限制、全局 min_free、局部 min_free)提高内存限制。

我还能做些什么吗?

是否有任何替代实施cumulative/2global_cardinality/2可以具有更好的性能?

prolog swi-prolog clpfd

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

如何在不按空格键的情况下查看SWI-Prolog中的所有答案?

简单的例子:

?- between(1,10,X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10.
Run Code Online (Sandbox Code Playgroud)

当使用SWL-Prolog使用REPL查看下一个答案时,必须按下空格键.

如何在不按空格键的情况下将所有结果列在屏幕上?

如果这是一个重复的问题,请告诉我,我找不到一个.


细节

我知道第一个想法很多就是使用bagof/3,但实际目标是使用DCG 解析这个3 GB的文件(Uniprot - uniprot_sprot.dat.gz)(文件格式).现在我只想查看tokenizer/lexer是否可以在不停止的情况下完成整个文件.由于数据是一个平面文件数据库(面向行),每行可以独立处理,因此代码首先使用phrase_from_file/2拉出一行,然后根据短语/ 2将其传递给一个标记器,例如,对于一个简单的例子,请参阅Mat的回答如何将文件中的数据读入Prolog,有关更精确的解决方案,请参阅GitHub mzapotoczny/prolog-interpreter.后者将进行解析,然后使用该阶段的输出来加载Neo4j数据库.


处理大文件的注意事项:

最初文件的处理方式与此答案类似,并使用了 …

prolog swi-prolog prolog-toplevel

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

如何将 csv 文件读入 SWI prolog 中的列表列表,其中内部列表代表 CSV 的每一行?

我有一个类似于下面的 CSV 文件:即不是 Prolog 格式

james,facebook,intel,samsung
rebecca,intel,samsung,facebook
Ian,samsung,facebook,intel
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个 Prolog 谓词来读取文件并返回一个看起来像的列表

[[james,facebook,intel,samsung],[rebecca,intel,samsung,facebook],[Ian,samsung,facebook,intel]]
Run Code Online (Sandbox Code Playgroud)

在其他谓词中进一步使用。

我仍然是一个初学者,并从 SO 中找到了一些很好的信息并对其进行了修改以查看我是否可以得到它,但我被卡住了,因为我只生成了一个看起来像这样的列表

[[(james,facebook,intel,samsung)],[(rebecca,intel,samsung,facebook)],[(Ian,samsung,facebook,intel)]]
Run Code Online (Sandbox Code Playgroud)

这意味着当我调用内部列表的头部时,我得到(james,facebook,intel,samsung)而不是james.

这是正在使用的代码:-(在 SO 上看到并已修改)

stream_representations(Input,Lines) :-
    read_line_to_codes(Input,Line),
    (   Line == end_of_file 
    ->  Lines = []
    ;   atom_codes(FinalLine, Line), 
        term_to_atom(LineTerm,FinalLine), 
        Lines = [[LineTerm] | FurtherLines],
        stream_representations(Input,FurtherLines) 
    ).
Run Code Online (Sandbox Code Playgroud)
main(Lines) :- 
    open('file.txt', read, Input), 
    stream_representations(Input, Lines), 
    close(Input).
Run Code Online (Sandbox Code Playgroud)

csv io prolog swi-prolog dcg

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

SWI Prolog 使用什么发生检查优化?

引用SICStus Prolog 手册

逻辑编程背后的常用数学理论禁止创建循环项,规定每次变量与项统一时都应进行发生检查。不幸的是,发生检查会非常昂贵,以至于使 Prolog作为一种编程语言变得不切实际

但是,我运行了这些基准测试(Prolog 的基准测试)并发现 SWI Prolog 在打开和关闭发生检查 (OC) 之间存在相当小的差异(小于 20%):

OC 关闭::- set_prolog_flag(occurs_check, false)..swiplrc(重新启动)

?- run_interleaved(10).
% 768,486,984 inferences, 91.483 CPU in 91.483 seconds (100% CPU, 8400298 Lips)
true.

?- run(1).
'Program'            Time     GC
================================
boyer               0.453  0.059
browse              0.395  0.000
chat_parser         0.693  0.000
crypt               0.481  0.000
fast_mu             0.628  0.000
flatten             0.584  0.000
meta_qsort          0.457  0.000
mu                  0.523  0.000
nreverse            0.406  0.000
poly_10 …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog occurs-check

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