基本的JavaScript问题:由于Java的情况没有硬限制(即IndexOutOfBoundsException),我们指定长度属性的声明的用途是什么?
var a = new Array(10);
Run Code Online (Sandbox Code Playgroud)
我知道它预定了长度并将"未定义"放入那些空白点.这个理由足够了吗?
当我撇了一些序言最近相关的问题,我偶然发现这个答案通过@mat质疑如何在Prolog中表示定向循环图,可直接通往邻居verticies.
到目前为止,我在Prolog中对属性变量的个人经验非常有限.但@mat给出的用例激发了我的兴趣.所以我尝试用它来回答另一个问题,用约束逻辑编程排序列表.
首先,好消息:我第一次使用归因变量就像我想要的那样.
然后,不是那么好的消息:当我通过回答发布时,我意识到在Prolog中有几个API和属性变量的实现.
我觉得我在这里过头了......特别是我想知道以下内容:
很多问号,这里......请分享你的经验/立场?先感谢您!
这是上面提到的答案的代码片段:
init_att_var(X,Z) :-
put_attr(Z,value,X).
get_att_value(Var,Value) :-
get_attr(Var,value,Value).
Run Code Online (Sandbox Code Playgroud)
到目前为止,我"只"使用put_attr/3
和get_attr/3
,但是 - 根据SICStus Prolog文档中的属性变量--- SICStus提供put_attr/2
和get_attr/2
.
因此,即使是非常浅的用例也 需要一些仿真层(一种方式或另一种方式).
我正在尝试解决prolog中的约束处理问题.
我需要在10x10的网格中打包4个5x5,4x4,3x3和2x2的正方形.它们可能不重叠.
我的变量看起来像这样:
Name: SqX(i), i=1..10, domain: 1..10
Run Code Online (Sandbox Code Playgroud)
其中X是5,4,3或2.索引i表示行,域表示网格中的列.
我的第一个约束试图定义正方形的宽度和高度.我这样制定它:
Constraint: SqX(i) > SqX(j)-X /\ i>j-X, range: i>0 /\ j>0
Run Code Online (Sandbox Code Playgroud)
这样可能的点被约束在彼此的X行和列之内.然而,Prolog会停止这些约束并给出以下结果:
Adding constraint "(Sq5_I > Sq5_J-5) /\ (I>J-5)" for values:
I=1, J=1,
I=1, J=2,
I=1, J=3,
I=1, J=4,
I=1, J=5,
I=1, J=6,
=======================[ End Solutions ]=======================
Run Code Online (Sandbox Code Playgroud)
所以它停在那里,甚至没有检查其他方块.我的约束很可能太紧张,但我不明白为什么或如何.有什么建议?
标准术语顺序(ISO/IEC 13211-1 7.2术语顺序)是在所有术语(包括变量)上定义的.虽然有很好的用途 - 想想实现setof/3
,但这使得许多其他清洁和逻辑用途的内置插件在8.4 Term比较中声明性的噩梦与imps(命令式构造的简短形式)四处都有.8.4术语比较功能:
8.4术语比较
8.4.1(@ = <)/ 2,(==)/ 2,(\ ==)/ 2,(@ <)/ 2,(@>)/ 2,(@> =)/ 2.
8.4.2比较/ 3.
8.4.3 sort/2.
8.4.4 keysort/2.
举个例子,考虑一下:
?- X @< a.
true.
Run Code Online (Sandbox Code Playgroud)
这成功了,因为
7.2期限订单
命令term_precedes(3.181)定义
术语X
术语是否在术语之前Y
.如果
X
且Y
是相同的术语,则X
term_precedesY
和Y
term_precedesX
都是假的.如果
X
和Y
有不同的类型:X
term_precedesY
当且仅当该
类型X
先于类型Y
按以下顺序:
variable
先floating point
先于integer
先 …
一些Prolog目标确定性成功的问题一次又一次地出现 - 至少 - 以下问题:
使用了不同的方法(例如,引发某些资源错误,或仔细查看Prolog toplevel给出的确切答案),但它们对我来说都有点不合适.
我正在寻找一种通用的,可移植的,符合ISO的方式来查明某些Prolog目标(成功)的执行是否会留下一些选择点.有些元谓词,也许?
你能否向我提示正确的方向?先感谢您!
现在,我正在学习如何使用C代码连接SICStus Prolog.
我想在SICStus Prolog版本4中使用/使用/查看任意大小的整数的"汉明重量"的C实现.
在我看来,我需要C函数来测试术语类型(SP_is_integer)和C函数来访问Prolog术语(SP_get_integer,SP_get_integer_bytes).
但是,我不确定如何以便携,健壮的方式使用SP_get_integer_bytes.你能指点一些精心设计的C代码做到这一点吗?
lcs([ H|L1],[ H|L2],[H|Lcs]) :-
!,
lcs(L1,L2,Lcs).
lcs([H1|L1],[H2|L2],Lcs):-
lcs( L1 ,[H2|L2],Lcs1),
lcs([H1|L1], L2 ,Lcs2),
longest(Lcs1,Lcs2,Lcs),
!.
lcs(_,_,[]).
longest(L1,L2,Longest) :-
length(L1,Length1),
length(L2,Length2),
( Length1 > Length2
-> Longest = L1
; Longest = L2
).
Run Code Online (Sandbox Code Playgroud)
到目前为止这是我的代码.我怎样才能优化它以便打印前缀,例如:
["interview", "interrupt", "integrate", "intermediate"]
Run Code Online (Sandbox Code Playgroud)
应该回来 "inte"
Prolog有点生疏,有一段时间没做过:)
我试图找出如何连接两个原子:
A = 'my ',
B = 'atom',
Run Code Online (Sandbox Code Playgroud)
如何连接这两个原子,结果如下:
'my atom'
Run Code Online (Sandbox Code Playgroud)
?
我想知道在各种Prolog实现上如何实现智能的第一个参数索引.
特别是,简单的类型测试目标,例如integer/1
在"颈部"条款之后,可以有助于更好的索引.考虑:
foo(h(X),X).
foo([],nil).
foo([_|_],cons).
foo(X,Y) :- integer(X), Y = n(X).
Run Code Online (Sandbox Code Playgroud)
通过这个子句排序,我希望目标foo([],_)
能够成功而不会留下任何无用的选择点.
不幸的是,SWI Prolog没有弄明白:
?- length(Xs,10),
maplist(=([]),Xs),
statistics(trailused,T1),
maplist(foo,Xs,Ys),
statistics(trailused,T2).
T1 = 5792,
T2 = 5968,
Xs = [[], [], [], [], [], [], [], [], [], []],
Ys = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] ...
Run Code Online (Sandbox Code Playgroud)
其他Prolog实现做得更好吗?
是否有任何Prolog实现支持使用大页面(每个内存页2MB/4MB)而不是vanilla 4Kb内存页.
理想情况下,我想向解释器/编译器/运行时声明,对于某些特定应用程序,可以将X大页面用于各种堆/堆栈/暂存器内存.
当然,并非所有应用程序都可以从中受益,但我确信不止一些应用程序会受益.毕竟,兆字节是新的千字节 :)
prolog ×9
prolog-dif ×2
c ×1
clpb ×1
clpfd ×1
constraints ×1
ffi ×1
huge-pages ×1
indexing ×1
iso-prolog ×1
javascript ×1
list ×1
performance ×1
prolog-cut ×1
sorting ×1
tlb ×1