问题标签 [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.

0 投票
0 回答
144 浏览

prolog - 无法显示约束值 - SICStus clpfd

我正在尝试解决包含以下内容的类的问题:

用从 1 到 6 的不同数字填充每个桶侧的白色单元格。数字不能在每个水平和垂直方向上重复。桶顶部的每个数字必须等于桶中四个不同数字的总和或乘积。所有最高数字都不同且小于 91。

我可以很好地获得结果,但我需要显示桶的结果,当我运行我的基本案例时,它会显示:

第一个列表是桶,第二个列表是用标签计算的矩阵。

为了计算桶,我使用这个规则:

由于 SICStus 没有产品计算规则,我创建了这个:

我不明白问题究竟出在哪里。

  • 在我的产品规则中 - >它似乎正确统一但似乎不是当 1 在子列表中时。
  • 我如何统一 sum 或 prod -> 也许那个桶可以是 sum 或 prod 并且不能正确地与Set统一。
0 投票
1 回答
748 浏览

prolog - Prolog 约束 -> 解决拼图网格

所以伙计们,我正在用 prolog 学习约束,并尝试使用这些新知识来实现​​一个小难题。

这个谜题的目标很简单:我有一个方形网格,每列的顶部/下方以及每行的右侧/左侧都有一些数字。值的域从 0 到 Gridsize -1,这意味着,一个 7x7 的网格可以有从 0 到 6 的数字。约束如下:

  • 每个数字每行每列只能出现一次
  • 顶部/右侧的数字分别是列/行上的第一个和最后一个数字的总和
  • 底部/左侧的数字分别是列/行上的 Second 和 SecondLast 数字的总和
  • 零不计为数字,仅在程序上表示空格

例如:

TopConstraint = [7, 6, 4, 7, 3] RightConstraint = [5, 5, 5, 5, 5] BottomConstraint = [3, 4, 6, 3, 7] LeftConstraint = [5, 5, 5, 5, 5]

这个约束也可以有一个 0,这使得程序简单地忽略(总和可以是任何数字,如果它与其他限制相应)。

上述列表的一种解决方案是矩阵:

3 | 4 | 1 | | 2 1 | 3 | 2 | 4 | 2 | | 4 | 1 | 3 | 1 | 3 | 2 | 4 4 | 2 | | 3 | 1

现在的问题是:我的约束不知何故没有应用,程序也没有给我解决方案。

在放置正确的域并将所有列/行单元格不同(没有任何其他限制它给了我预期的解决方案)之后,我有这个代码适用于每个单元格,总和限制:

put_restrictions(Sol, Gridsize, SumT, SumR, SumB, SumL):- put_restrictions_row(Sol, Gridsize, SumR, SumL, 1), put_restrictions_col(Sol, Gridsize, SumT, SumB, 1). 其中Gridsize是对其进行迭代的Gridsize,SumT、SumR、SumB、SumL分别是上述约束列表,1开始迭代计数器。

所以这个谓词是我的问题所在

我认为代码是非常自我解释的,如果不是,我正在尝试做什么:

如果右侧有约束:

  • 如果该行的第一个和最后一个单元格不为 0,则它们的总和为 = 限制
  • 如果该行的第一个单元格为 0,则该行的第二个单元格与限制的最后一个 = 的总和 -> 使左侧限制为左侧第三个单元格和倒数第二个单元格的总和等等。 .

我没有得到任何解决这个问题的办法。我在关联约束时做错了什么?

欢迎任何帮助。提前感谢您在这里帮助prologNoob:P

0 投票
1 回答
403 浏览

c - 将任意大小的整数从 Prolog 传递给 C

现在,我正在学习如何将 SICStus Prolog 与 C 代码接口。

我想在 SICStus Prolog 版本 4 中拥有/使用/查看任意大小整数的“汉明权重”的 C 实现。

在我看来,我需要 C 函数来测试术语类型(SP_is_integer)和 C 函数来访问 Prolog 术语(SP_get_integer、SP_get_integer_bytes)。

但是,我不确定如何以可移植、健壮的方式使用 SP_get_integer_bytes。你能指点我一些精心设计的可靠的 C 代码吗?

0 投票
1 回答
280 浏览

prolog - SICStus Prolog JIT 编译器

SICStus Prolog 4.3 为 x86-64 处理器添加了 JIT 编译器。

我有两个关于 JIT 编译器的问题。

首先,我在哪里可以找到有关 JIT 编译器功能(以及限制、设计和技术)的文档(论文、注释或备忘录)?

其次,能否指示 SICStus 发出 JIT 编译器生成的 x86-64 汇编代码?

0 投票
2 回答
85 浏览

c - SICStus Prolog 4:将整数从 Prolog 传递到 C

仍在学习 SICStus Prolog 4 FFI 到 C 的技巧,我对https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/中的示例谓词 c1/2 有一个具体问题Foreign-Code-Examples.html#Foreign-Code-Examples

ex.pl 包括以下行:

ex.c 包括以下代码段:

这适用于小整数:

它不适用于大整数:

如何正确(有效地)处理小整数和大整数?IIRC 大整数不能作为“SP_integers”传递,所以我应该将这些值作为术语(“SP_term_ref”)传递并进行适当的动态类型检查(可能随后进行数据提取)?请帮忙!

0 投票
1 回答
93 浏览

prolog - Prolog中微基准测试的维度

我想对谓词 int_cntA/2 进行微基准测试...

...针对谓词 int_cntB/2:

我不是 100% 确定我需要考虑什么才能获得好的结果……什么是有趣的维度?

到目前为止,我想出了:我应该将元调用性能包括在基准测试中还是应该与原始数字运算有关?循环是否应该由故障驱动?我应该关心执行期间产生的垃圾吗?

以下代码片段是一个简单的基准测试实现,它适用于原始性能,是故障驱动的,并且(因此)不关心垃圾:

int_cntA/2 的代码:

int_cntB/2 的代码:

在运行 SICStus Prolog 4.3.1 的 Intel Core i7 Haswell 机器上,由于不同的基准测试方法(A、B、C)导致的最坏情况性能差异超过 100%:

如果/如何进一步降低微基准测试的开销,您有什么想法吗?谢谢!

0 投票
1 回答
315 浏览

prolog - Prolog - 重新加载源文件

我刚刚使用 Sicstus 在 Prolog 中创建了一个游戏。

在游戏过程中,我使用assert's 和retract's 来更新我使用的一些变量的值。

游戏结束后,如果我没有reconsult源文件,重新运行游戏,那些变量与过去游戏的内容相同,这是有道理的。

所以我要问的是是否存在某种内置谓词,我可以在游戏结束时调用它,以便重新查询源文件,建立游戏的原始数据。(我知道这是一种懒惰的方式。)

0 投票
1 回答
49 浏览

testing - 如何使用 Prolog 测试术语?

如何使用这些表达方式?

  • SP_term_type() 访问术语类型
  • SP_is_variable() 检查 term 是否是一个变量。
  • SP_is_integer() 检查 term 是否为整数。
  • SP_is_float() 检查术语是否为浮点数。
  • SP_is_atom() 检查 term 是否是原子。
  • SP_is_compound() 检查 term 是否是复合词。
  • SP_is_list() 检查 term 是否是一个列表。
  • SP_is_atomic() 检查 term 是否是原子的。
  • SP_is_number()
0 投票
2 回答
274 浏览

prolog - SICStus Prolog 4.3.2:clpfd 没电了?

如果我可以用它们的所有基于整数的算术,我的一些 Prolog 程序可能会受益颇多 (is)/2

所以我想要权力......用 ......所以我可以X is 10^3用clpfd-y代替:)

考虑以下五个支持的 Prolog 处理器:

请提供想法/提示/建议。我能做些什么?也许使用一些兼容层?

先感谢您!

0 投票
2 回答
468 浏览

sicstus-prolog - prolog中的count /3和for/3有什么区别?

prolog 中的 count/3 和 for/3 有什么区别?以及如何使用减量-1的 for 循环(如for(I,9,0,-1))?

  • 例如 :

    Dec=-2, Min_bound=0, Max_bound=9
    结果 => 9,7,5,3,1