问题标签 [sicstus-prolog]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
module - SICStus 的 make/0 功能
如何确保所有模块(以及理想情况下已加载或包含的所有其他文件)都是最新的?发布时use_module(mymodule)
,SICStus 会比较文件的修改日期mymodule.pl
并重新加载(如果更新)。此外include
-ed 文件将触发重新编译。但它不会重新检查mymodule
.
简而言之,我怎样才能获得与 SWI 提供的类似功能make/0
?
file - 将文本文件中的数据分割成事实列表到 prolog 文件
我想将数据文件分成事实列表,例如functor(arg1, arg2, ..., argN)
仿函数的名称是大写行,参数是跟随它们的小写行,随后,新子句保存在执行时创建的序言文件中
文件.txt
结果 :
文件.pl
“。” 将作为最后一个附加
在构建和编译新的prolog 文件之后file.pl
:
list - 从 maplist/3 结果中过滤随机结果
List=['F1',a1,a2,' LF2',a1,a2]
我希望用下面的谓词 is_upper/2 和 maplist/3过滤掉这个列表
is_upper(Elem,Res)
:如果Elem
是大写原子,它将被分配给 Res 然后我想将所有大写原子放入列表List_Upper
我试试这个;
我如何过滤随机数_A,_B...
预期结果:
问候
concurrency - Prolog 延迟评估:LIFO 或 FIFO 唤醒?
许多 Prolog 系统都有一个freeze/2
谓词,这个谓词可能应该有这个名字geler/2
,因为它甚至在 Prolog-II 之前就被发明了。
假设我对同一个变量有一个条件,但有两个不同的目标,即:
首选的唤醒策略是什么,是先执行 G1 还是先执行 G2?如果 G1 和 G2 确实产生了新的冻结,它们也被唤醒了怎么办:
G3或G4总是在G1和G2之间执行,还是G3或G4在G1和G2之后执行,甚至更晚?
再见
prolog - 使用 SICStus 拆分原子,如 SWI 中的 atomic_list_concat/3
我有一个原子'id1,id2,id3'
,我想用与 SWI 中的谓词 atomic_list_concat/3 相同的方式将其拆分为列表。
预期结果
无论如何,是否可以使用DCG来做到这一点
prolog - SICStus Prolog:FFI 慢,如何快速计算汉明权重?
当我运行外部代码示例c1/2
时,如 SICStus Prolog 4.3.2 手册中所示,并将其运行时与相应的 Prolog 代码进行比较Y is X+9
,我得到了奇怪的计时结果:
启用 JIT 后,我观察到:
关闭 JIT ( SP_JIT=disabled
) 后,时序变化如下:
即使没有适当的错误处理和对大整数的支持,C 代码的运行时间几乎是 JITted Prolog 代码的 4 倍。关闭 JIT 会稍微改变计时数字,但总体情况保持不变。
如何加快 SICStus 中的汉明权重计算?SWI 有一个专用的算术函数,但 SICStus 似乎不支持它(还)...... popcount/1
prolog - 将 goal_expansion/6 限制为仅编译时间
在 SICStus Prolog 中,有一个用于扩展目标的钩子:goal_expansion/6
它在编译时和运行时在元调用期间都被调用。这些调用会产生相当多的运行时开销,从而减慢元调用的速度。我扩展的目的只是优化。所以在语义上目标和扩展目标是等价的。
如何在运行时禁用此类调用?
(看来我必须取消goal_expansion/6
这对我来说有点粗鲁。它也会妨碍轻量级重新编译)。
prolog - 意外错误“!分段违规”
最近在编译我的项目时,有时会出现意想不到的错误,
错误 :
有没有解释发生了什么!
prolog - 内置 Prolog 谓词 (is)/2 的性能
更新:11.6.2016
我在 SICStus Prolog 4.3.2 中观察到的令人费解的性能差异在最近发布的 SICStus Prolog 4.3.3中完全消失了。赞!
我更新了下面的“运行时”表以包括 SICStus Prolog 4.3.3。亮点包括:
(is)/2
比以前快 10 倍。val_of/2
速度也非常快,几乎快了 2 倍!
美高;-)
在回答“ Prolog 语言中的大小程序”问题时, SO 用户 @ThanosTintinidis提出了一种非常简单的方法1,将初学者介绍给deriving length/2
:
[...] 另请注意,
E
仅需要实例化它是因为 is 将评估表达式。你可以这样写:如果你称之为:
有趣,不是吗?您可能想要评估最后一个
E
,即 call?- size([1,2], E), N is E
。[...]
乐趣? 大乐趣! 许多有趣的实验摆在面前:
左倾树与右倾树
/li>内置
/li>(is)/2
vsval_of/2
go(2000000)
为了测量我使用不同的 Prolog 处理器2运行的运行时间:
在Intel Core i7-4700MQ 上,我使用 SICStus 和 SWI 观察到以下运行时:
我对这些(可重现的)结果感到困惑......有人可以告诉我发生了什么吗?
脚注 1:为了简洁和可读性,变量名称稍作修改。
脚注 2:使用合适的命令行参数运行 SWI-Prolog 7.3.20 swipl -G2G -L2G -O
。
prolog - Prolog:包含断言的规则仅将第一个结果添加到事实
我正在尝试预先计算一些东西并将结果保存为程序开头的事实:(简化代码)
但是当我在 SICStus Prolog 中查阅文件时,只有第一个结果 cost(1,20) 被断言:
但是,当我直接在 SICStus prolog 控制台中输入 assert_all 的右侧时,两个 cost/2 事实都在那里。
我发现这种行为非常令人困惑,这是怎么回事?