请考虑以下类:
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) 请考虑以下代码:
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) 我试图定义一个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没有内置的粘合剂来代表,?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其外部被撤消,因此顶层不报告它.它仍然可以通过添加 …
我只是偶然在定义;/2中SWI 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定义?如果不是,你知道他们不同的例子吗?
假设我们有一个我们想要调试的多态函数,例如:
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) 我刚开始使用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)
这看起来有些奇怪:我正在介绍这个含义,只是为了在下一步中消除它.
我现在的问题是:
我正在使用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再次可见.
如何在不使文件完整库的情况下向绿洲配置添加其他路径?
我经常在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)
但这掩盖了实际的计算.有更简洁的选择吗?
编辑:杰弗里斯科菲尔德评论说,在没有嵌套的情况下,显式转换函数运行良好.是否还有嵌套类型匹配的版本?
我想编写一个导出谓词的模块,其中用户应该能够将谓词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 不支持模块)。有没有办法让用户不需要自己设置优先级?
谁能告诉我下面的代码片段会如何执行?
码:-
int a = 3, b = 4;
a = (a > b) ? a : b;
System.out.print(a);
Run Code Online (Sandbox Code Playgroud)