我试图复制标准长度/ 2谓词的行为.特别是,我希望我的谓词适用于有界和无界的参数,如下例所示:
% Case 1
?- length(X, Y).
X = [],
Y = 0 ;
X = [_G4326],
Y = 1 ;
X = [_G4326, _G4329],
Y = 2 ;
X = [_G4326, _G4329, _G4332],
Y = 3 .
% Case 2
?- length([a,b,c], X).
X = 3.
% Case 3
?- length(X, 4).
X = [_G4314, _G4317, _G4320, _G4323].
% Case 4
?- length([a,b,c,d,e], 5).
true.
Run Code Online (Sandbox Code Playgroud)
简单实用:
my_length([], 0).
my_length([_|T], N) :- my_length(T, X), N is 1+X.
Run Code Online (Sandbox Code Playgroud)
有一些问题.在案例3中,在产生正确答案之后,它进入无限循环.这个谓词可以转化为确定性的吗? …
使用PostgreSQL 9.4:
SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::numrange x) q;
> [1,2] | 1 | 2 -- looks OK
SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::int4range x) q;
> [1,3) | 1 | >>3<< -- this is unexpected
Run Code Online (Sandbox Code Playgroud)
让我们进一步检查:
SELECT x, lower(x), upper(x) FROM (SELECT '[1,3)'::numrange x) q1;
> [1,3) | 1 | 3 -- looks OK
SELECT x, lower(x), upper(x) FROM (SELECT '[1,3]'::numrange x) q1;
> [1,3] | 1 | 3 -- looks OK
Run Code Online (Sandbox Code Playgroud)
来自pg文档:
upper(anyrange)| 范围的元素类型| 范围的上限| …