小编lam*_*y.x的帖子

为什么 Java 字符串比较在 Java 15 和 Java 11 中表现不同?

请考虑以下类:

class Eq {
  public static void main(String[] args) {
    System.out.println("" == ".".substring(1));
  }
}
Run Code Online (Sandbox Code Playgroud)

该示例应该显示内存中可能存在空字符串的多个副本。我仍然有一个旧的 OpenJDK 11,程序false按预期输出。在 OpenJDK 15 下,程序输出true. 为类文件生成的字节码看起来相似(即使它们的寄存器值不同):

爪哇11:

public static void main(java.lang.String[]);
  Code:
     0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
     3: ldc           #13                 // String
     5: ldc           #15                 // String .
     7: iconst_1
     8: invokevirtual #17                 // Method java/lang/String.substring:(I)Ljava/lang/String;
    11: if_acmpne     18
    14: iconst_1
    15: goto          19
    18: iconst_0
    19: invokevirtual #23                 // Method java/io/PrintStream.println:(Z)V
    22: return
Run Code Online (Sandbox Code Playgroud)

爪哇 15:

public static void …
Run Code Online (Sandbox Code Playgroud)

java memory string equality

27
推荐指数
1
解决办法
1404
查看次数

警告40的含义是什么:此记录...包含在当前范围内不可见的字段

请考虑以下代码:

module A =
  struct
    type r = { i : int; s: string }
  end

module B =
  struct
    type r = { i : int; s : string }
  end


let f (x : A.r) : B.r = match x with
    { i; s } -> { i = 2*i; s = "" }
Run Code Online (Sandbox Code Playgroud)

两个模块定义完全相同的记录.函数f将A记录转换为B记录.警告已在编译期间发出,但也可以交互显示.在ocaml cli上,似乎对f的调用完成了预期的事情:

# let x = f { i = 5; s = "ab" };;
Characters 10-29:
  let x = f { i = …
Run Code Online (Sandbox Code Playgroud)

ocaml

14
推荐指数
1
解决办法
2385
查看次数

改进了call_with_time_limit/call_with_inference_limit

我试图定义一个callto_status(Goal, Status)总是成功的关系,并根据调用的结果统一Status Goal(换句话说,我想实现一个改进版本call_with_inference_limit/3).我的实现使用的SWI call_with_inference_limit/3具有相同的接口call_with_time_limit/3(在这种情况下也应该使它工作).实施call_with_..._limit并没有回溯,所以我认为最好不要给人一种报告目标答案替代的印象.

我介绍了辅助谓词derivable_st的可读性.它处理成功和超时的情况,但否则失败.

% if Goal succeeds, succeed with Status = true,
% if Goal times out, succeed with Status = timeout
% if Goal fails, fail
derivable_st(Goal, Status) :-
    T = 10000,                               % set inference limit
%    copy_term(Goal, G),                    % work on a copy of Goal, we don't want to report an answer substitution
    call_with_inference_limit(G, T, R),     % actual call to set inference limit
    ( …
Run Code Online (Sandbox Code Playgroud)

prolog meta-predicate

7
推荐指数
1
解决办法
111
查看次数

Prolog中的粘合剂

我知道Prolog没有内置的粘合剂来代表,?x (x=1)但我想知道是否有可能实现它们.在某些谓词中setof/3,行为非常接近:X查询的答案替换中的变量

?- setof(X, member(X,[a,a,c]), Xs).
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

是没有约束的,我们可以给它一个我们喜欢的价值:

?- setof(X, member(X,[a,a,c]), Xs), X = b.
X = b,
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

但如果我们X早些时候实例化,我们会失去解决方案:

?- X = b, setof(X, member(X,[a,a,c]), Xs).
false.
Run Code Online (Sandbox Code Playgroud)

我想要发生的是,setof绑定X,即用于评估setof,X被视为一个新变量.为了使这个多一点具体:是否有可能得到实现binding_setof,从而

?- X = b, binding_setof(X, member(X,[a,a,c]), Xs).
X = b,
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

PS:我知道像λProlog这样的语言是为解决这个问题而构建的,但我对Prolog解决方案很感兴趣.

编辑:我试图解决问题library(lambda).我的目的是创建一个匿名变量并将其应用于\X^setof(X, member(X,[a,c,c], Xs)via call/N.由于绑定在Xs其外部被撤消,因此顶层不报告它.它仍然可以通过添加 …

lambda prolog

6
推荐指数
1
解决办法
132
查看次数

析取算子和定义与几个规则的等价性

我只是偶然在定义;/2SWI Prolog的手册的规定:

The `or' predicate is defined as:

Goal1 ; _Goal2 :- Goal1.
_Goal1 ; Goal2 :- Goal2.
Run Code Online (Sandbox Code Playgroud)

这是否意味着;/2行为完全像我们编写自己的包含两个规则的辅助谓词一样?我记得这;/2是一个不纯的结构(但我可能将它与if-then-else混合在一起)但这个定义是纯粹的(虽然是元逻辑的).

语义;/2在第7.8.6段的ISO标准中定义,但这是在操纵当前状态,选择点等方面完成的.

SWI手册中的定义是否等同于ISO定义?如果不是,你知道他们不同的例子吗?

prolog iso-prolog

6
推荐指数
1
解决办法
106
查看次数

在ocamldebug中打印多态型的表达

假设我们有一个我们想要调试的多态函数,例如:

let rec rev lst = match lst with
  | [] -> []
  | x::xs -> List.append (rev xs) [x]
Run Code Online (Sandbox Code Playgroud)

要创建一个程序,我们添加一个main函数:

let () = ignore (rev [1;2;3;4])
Run Code Online (Sandbox Code Playgroud)

结果是无关紧要的,但是注意rev用int列表调用,即非多态类型.

当我在ocamldebug中调试执行时,我只在打印list参数时得到一个通用列表:

(ocd) break @ Rev 1
(ocd) run
Breakpoint: 1
1 let rec rev lst = <|b|>match lst with
(ocd) print lst
lst: 'a list = [<poly>; <poly>; <poly>; <poly>]
Run Code Online (Sandbox Code Playgroud)

我知道没有纯粹的(即非camlp4)方式来获得通用的打印功能,但这种限制是否适用于ocamldebug?换句话说:是否可以在调试器中获取列表[1;2;3;4]而不是<poly>s?

编辑: 用户ivg建议通过安装相应类型的打印功能#install_printer.我创建了一个具有以下功能的新模块pp:

let rec pplist ch fmt = function
| [] -> ()
| x::xs …
Run Code Online (Sandbox Code Playgroud)

ocaml

5
推荐指数
1
解决办法
537
查看次数

给定一个具有对象逻辑含义的定理"P(t)⟶(∃x.P(x))",为什么证明目标"P(t)⟹(∃x.P(x))"与meta-给出逻辑含义?

我刚开始使用Isabelle/HOL并试图用自然演绎规则证明一个简单的HOL语句"P(t)⟶(∃x.P(x))".我从一个仅包含该定理的理论文件开始:

theory simple imports Main
begin

lemma T: shows "P(t) ? (?x . P(x))"
proof
  (* x *)
qed  

end
Run Code Online (Sandbox Code Playgroud)

在注释中标记为x的位置处,当前目标已经是"P(t)⟹(∃x.P(x))",即逻辑蕴涵已经简化为元逻辑蕴涵.

通过反复试验,我得出以下证据:

proof
  assume "P(t)" then
  have "? x . P(x)" by (rule exI) then
  have "P(t) ? (?x . P(x))" by (rule impI)
  then show "P(t) ? (?x . P(x))" by (rule impE)
qed
Run Code Online (Sandbox Code Playgroud)

这看起来有些奇怪:我正在介绍这个含义,只是为了在下一步中消除它.

我现在的问题是:

  1. 重写我的目标来自哪里,哪里可以找到更多关于它的信息?
  2. 如何简化证明(不使用auto绕过ND)?

isabelle

5
推荐指数
1
解决办法
112
查看次数

Oasis构建配置与子目录

我正在使用oasis来构建我的ocaml项目,源代码存在于一个名为src的目录中.绿洲构建文件看起来像这样:

OASISFormat: 0.4
Name:        Test
Version:     0.1
Synopsis:    no
Authors:     Me
License:     BSD-3-clause
Plugins:     META (0.4)

Executable abc
  Path:        src
  BuildTools:  ocamlbuild
  MainIs:      main.ml
Run Code Online (Sandbox Code Playgroud)

现在我想将文件组织到子文件夹中,将a.mli和a.ml放入src/util中.执行此操作后,模块对ocamlbuild/ocamlc不可见,从而导致"未绑定的模块A"错误.如果我手动调用ocamlc,我可以添加-I src/util标志以使a.mli再次可见.

如何在不使文件完整库的情况下向绿洲配置添加其他路径?

ocaml ocamlbuild

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

警告8:let语句中的模式匹配警告不完整

我经常在let语句中进行模式匹配,在那里我知道结果的形状.很明显,我不能指望编译器通常会推断出这些知识,但也许有一种更为惯用的方式可以用简洁的方式来实现.

例如,请查看以下代码:

type foo = A of int | B of string
let x = (true, A 0)
let (b, A i) = x in i + 2 
Run Code Online (Sandbox Code Playgroud)

这正确警告我,结果(_, B _)不匹配.一种可能的方法是显式处理丢失的案例,如:

let (b,i)  = match x with 
    | (a, A j) -> (a,j+2)
    | _ -> failwith "implementation error!" 
Run Code Online (Sandbox Code Playgroud)

但这掩盖了实际的计算.有更简洁的选择吗?

编辑:杰弗里斯科菲尔德评论说,在没有嵌套的情况下,显式转换函数运行良好.是否还有嵌套类型匹配的版本?

ocaml

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

在模块中重新定义导出谓词的运算符优先级

我想编写一个导出谓词的模块,其中用户应该能够将谓词p/1作为前缀运算符访问。我定义了以下模块:

:- module(lala, [p/1]).

:- op(500, fy, [p]).

p(comment).
p(ca).
p(va).
Run Code Online (Sandbox Code Playgroud)

并立即通过以下方式加载:

?- use_module(lala).
true.
Run Code Online (Sandbox Code Playgroud)

不幸的是,查询失败:

?- p X.
ERROR: Syntax error: Operator expected
ERROR: p
ERROR: ** here **
ERROR:  X .
Run Code Online (Sandbox Code Playgroud)

正确设置运算符优先级后,一切正常:

?- op(500, fy, [p]).
true.
?- p X.
X = comment ;
X = ca ;
X = va.
Run Code Online (Sandbox Code Playgroud)

我使用 SWI Prolog 进行输出,但在 YAP 中也出现同样的问题(GNU Prolog 不支持模块)。有没有办法让用户不需要自己设置优先级?

module operators prolog

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

这种表达方式如何工作

谁能告诉我下面的代码片段会如何执行?

码:-

int a = 3, b = 4;
a = (a > b) ? a : b;
System.out.print(a);
Run Code Online (Sandbox Code Playgroud)

java

-7
推荐指数
1
解决办法
75
查看次数