标签: sicstus-prolog

Prolog:测试是否设置了位

我使用任意精度整数来表示密集的位向量 - 大小从十几到几千不等.

我的代码经常需要检查是否设置了某些位,所以我做了一些微基准测试,看看某些变化是否明显快于其他变量:

bench_1(0, _, _) :- !.
bench_1(N, V, P) :- V /\ (1 << P) =\= 0, N0 is N-1, bench_1(N0, V, P).

bench_2(0, _, _) :- !.
bench_2(N, V, P) :- (V >> P) /\ 1 =:= 1, N0 is N-1, bench_2(N0, V, P).

bench_3(0, _, _) :- !.
bench_3(N, V, P) :- (V >> P) /\ 1 =\= 0, N0 is N-1, bench_3(N0, V, P).

bench_4(0, _, _) :- !.
bench_4(N, V, P) :- (V >> P) /\ …

benchmarking prolog microbenchmark sicstus-prolog

4
推荐指数
1
解决办法
80
查看次数

如何将变量域定义为非连续范围

我从SICStus Prolog开始,我想定义一个变量,比如说StartingTimes,有一个由list定义的域[1, 5, 10]

我怎样才能在SICStus Prolog中做到这一点?

我会做的事情如下:

 domain(StartingTimes, 1, 10)
 StartingTimes #= 1 #\/ StartingTimes #= 5 #\/ StartingTimes #= 10
Run Code Online (Sandbox Code Playgroud)

但那太可怕了.必须有一个简单的方法来做到这一点.也许fd_sets

注意:我试图找出它是如何在手动中完成的,但prolog使用常用词,并且很难使用谷歌.

prolog constraint-programming sicstus-prolog clpfd

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

如何将域变量添加到global_cardinality?

我正在尝试为global_cardinality我的程序添加约束,并在SICStus Prolog手册中写道:

global_cardinality(+ XS,+瓦尔斯)

global_cardinality(+ XS,+瓦尔斯+选项)

其中Xs = [X1,...,Xd]是整数或域变量的列表,Vals = [K1-V1,...,Kn-Vn]是对的列表,其中每个键Ki​​是唯一的整数Vi是域变量或整数.如果Xs的每个元素等于某个键,则为真,对于每对Ki-Vi,Xs的恰好Vi元素等于Ki.

现在我可以写:

global_cardinality([A,B,C], [1-2, 2-1]).
Run Code Online (Sandbox Code Playgroud)

说这个数字1会被使用两次.该号码2仅使用一次.

但我想说的是这个数字1会用到:once, twice or three times

根据手册我需要一个域变量但是它的正确语法是什么?

prolog constraint-programming sicstus-prolog clpfd

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

是否可以将变量的域设置为clpfd中的名称枚举?

我可以用这种方式指定变量的域:

MyVar in 1..10
Run Code Online (Sandbox Code Playgroud)

要么

MyVar in {1,10,15}
Run Code Online (Sandbox Code Playgroud)

但我有一个变量,我想这样指定:

Activity_1__room in {room_1, room_2}  % i.e. as atoms not as integers
Run Code Online (Sandbox Code Playgroud)

有可能吗?当然,可以将名称编码为整数,但这是否真的有必要?

prolog sicstus-prolog clpfd

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

Prolog powerset谓词

我希望定义一个谓词powerset(X,P),当P是X的powerset时,它是真的.无论P是否为地,都应该工作.

prolog powerset sicstus-prolog

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

为SICStus制作/ 0功能

如何确保所有模块(最好是所有其他已加载或包含的文件)都是最新的?发布时use_module(mymodule),SICStus会比较文件的修改日期mymodule.pl并重新加载,如果更新的话.另外的include-ed文件将触发重新编译.但它不会重新检查所使用的所有模块mymodule.

简而言之,我如何获得SWI提供的类似功能make/0

module prolog sicstus-prolog

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