小编dst*_*fel的帖子

使用 Runtime.exec() 生成的进程的高效执行和输出流重定向

我有一个脚本,它多次执行一个程序,向 STDERR 和 STDOUT 生成大约 350 行输出。现在,我需要用 Java 执行脚本,从而将输出流打印到它们的原始目的地。因此,基本上,我从 Java 类内部执行脚本,为用户维护原始行为。

我这样做的方式受到了诸如从 java Runtime.exec 读取流之类的建议的启发,并且在功能上运行良好。

Process p = Runtime.getRuntime().exec(cmdarray);
new Thread(new ProcessInputStreamHandler(p.getInputStream(), System.out)).start();
new Thread(new ProcessInputStreamHandler(p.getErrorStream(), System.err)).start();
return p.waitFor();
Run Code Online (Sandbox Code Playgroud)

和班级ProcessInputStreamHandler

class ProcessInputStreamHandler implements Runnable {
    private BufferedReader in_reader;
    private PrintStream out_stream;

    public ProcessInputStreamHandler(final InputStream in_stream, final PrintStream out_stream) {
        this.in_reader  = new BufferedReader(new InputStreamReader(in_stream));
        this.out_stream = out_stream;
    }

    @Override public void run() {
        String line;
        try {
            while ((line = in_reader.readLine()) != null) {
                out_stream.println(line);
            } …
Run Code Online (Sandbox Code Playgroud)

java performance multithreading stream runtime.exec

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

Coq:使用类型相等对定义中的术语进行类型检查

我有一个关于 Coq 中类型检查定义的问题。我遇到了这样一种情况,我有两个类型为 t1 和 t2 的项,从定义中我知道 t1 和 t2 相等 (t1 = t2)。但是,我不能一起使用这两个术语,因为类型检查器认为这些类型不相等。我试图隔离一个最小的示例来模拟情况(是的,我知道这是一个愚蠢的属性,但我只是希望它得到类型检查;)):

Require Import Coq.Lists.List.

Lemma myLemma :
  forall t1 t2 : Type,
    forall (l1 : list t1) (l2 : list t2),
      t1 = t2 ->
        l1 = l2.
Run Code Online (Sandbox Code Playgroud)

假设我不能(l2 : list t1)直接写,因为我从另一个定义中得到它。

我尝试使用,Program因为我希望我可以以某种方式推迟任务来证明类型匹配,但这没有帮助(得到相同的类型检查错误)。


如果上面的例子不足以让问题清楚,这里是我的实际问题的摘录:

Definition taclet_sound_new (t : taclet) :=
  forall K st seSt, let S := (sig K) in
    [(K, st)] |= (pathC seSt) ->
      (forall K', let S' := (sig K') …
Run Code Online (Sandbox Code Playgroud)

casting typechecking coq dependent-type

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

Key 难以处理三元运算符

我正在与 KeY ( https://www.key-project.org )一起玩一个教学项目。

一方面,我很高兴 KeY 轻松证明了以下带 jml 注释的 Java 代码的正确性

/*@ ensures ((\result == a) || (\result == b));                                                                        
  @ ensures ((\result >= a) && (\result >= b));                                                                        
*/
public int max(int a, int b) {
    if(a <= b)
            return b;
    else
            return a;
}
Run Code Online (Sandbox Code Playgroud)

但另一方面,令人惊讶的是,我无法证明以下等效程序的正确性

/*@ ensures ((\result == a) || (\result == b));                                                                        
  @ ensures ((\result >= a) && (\result >= b));                                                                        
*/
public int max(int a, int b) {
    return (a <= b) ? b …
Run Code Online (Sandbox Code Playgroud)

key-formal-verification

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