如何解析标准输入(不缓冲)?如果我理解正确,phrase/2需要一个列表,并phrase_from_file/2从library(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)?
我有一个程序在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)
任何人都可以发现我犯了什么错误,或者如果可能的话,我需要做一些修改,因为升级过程?
有关我的代码的其他信息:
任何帮助都非常感谢.
非常感谢
我想知道你是否知道使用prolog进行流处理的任何方法,即某种反应式编程,或者至少让查询在不断更新的知识库上运行(实际上是一个流),并且连续输出推理的输出?
流行的"prologs"中实现了什么,比如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/1,write/1,copy_term/2等。
我试图在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).垂直条是保留字符,我不允许在定义中使用吗?或者有什么方法可以解决这个问题?
我编写了一些谓词来解决大型调度问题,它们运行良好,但我希望它们具有更好的性能。我运行过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/2或global_cardinality/2可以具有更好的性能?
简单的例子:
?- 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数据库.
处理大文件的注意事项:
最初文件的处理方式与此答案类似,并使用了 …
我有一个类似于下面的 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) 逻辑编程背后的常用数学理论禁止创建循环项,规定每次变量与项统一时都应进行发生检查。不幸的是,发生检查会非常昂贵,以至于使 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) swi-prolog ×10
prolog ×9
c# ×1
clpfd ×1
csv ×1
dcg ×1
http ×1
interfacing ×1
io ×1
occurs-check ×1
operators ×1
stream ×1