我使用任意精度整数来表示密集的位向量 - 大小从十几到几千不等.
我的代码经常需要检查是否设置了某些位,所以我做了一些微基准测试,看看某些变化是否明显快于其他变量:
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) /\ …
我从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使用常用词,并且很难使用谷歌.
我正在尝试为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
根据手册我需要一个域变量但是它的正确语法是什么?
我可以用这种方式指定变量的域:
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)
有可能吗?当然,可以将名称编码为整数,但这是否真的有必要?
我希望定义一个谓词powerset(X,P),当P是X的powerset时,它是真的.无论P是否为地,都应该工作.
如何确保所有模块(最好是所有其他已加载或包含的文件)都是最新的?发布时use_module(mymodule),SICStus会比较文件的修改日期mymodule.pl并重新加载,如果更新的话.另外的include-ed文件将触发重新编译.但它不会重新检查所使用的所有模块mymodule.
简而言之,我如何获得SWI提供的类似功能make/0?