在交互式定理证明器Coq的,任何交互证明或定义可与被终止Qed或Defined.有一些"不透明"的概念Qed强制执行但Defined不强制执行.例如,Adam Chlipala 撰写的" 依赖类型认证编程 "一书指出:
我们用"
Defined而不是"结束"证据"Qed,以便我们构建的定义仍然可见.这与结束证明的情况形成对比Qed,其中证据的细节随后被隐藏.(更正式地,Defined将标识符标记为透明,允许它展开;同时Qed将标识符标记为不透明,防止展开.)
但是,我不太确定这在实践中意味着什么.有一个后来的例子,Defined由于需要Fix检查某个证据的结构,有必要使用,但我不明白这个"检查"的确切含义,或者为什么如果Qed使用它会失败.(看看定义Fix也不完全具有启发性).
从表面上看,很难说Qed实际上在做什么.例如,如果我写:
Definition x : bool.
exact false.
Qed.
Run Code Online (Sandbox Code Playgroud)
我仍然可以x通过执行命令看到值.Print x. 此外,我以后允许在"不透明"值上进行模式匹配x:
Definition not_x : bool :=
match x with
| true => false
| false => true
end.
Run Code Online (Sandbox Code Playgroud)
因此,我似乎能够使用正常的价值x.Chlipala教授在这里"展开"是什么意思?不透明和透明差异究竟有什么区别?最重要的是,这有什么特别之处Fix …
Emacs缩进我的代码,如下所示:
def my_function(
a, b, c):
pass
if my_function(
1, 2, 3):
pass
Run Code Online (Sandbox Code Playgroud)
但是,PEP8声明它应该像这样缩进,以避免将挂起的缩进与下一行混淆:
def my_function(
a, b, c):
pass
if my_function(
1, 2, 3):
pass
Run Code Online (Sandbox Code Playgroud)
如何在这种情况下(在左括号和换行符之后)配置emacs'old python.el以使用现有python-continuation-offset变量,以便缩进第二种方式?
我有一个java类,我在其中调用runhellscript方法来执行脚本.它与mysql一起工作得很好,但我似乎无法找出为什么它不能与psql很好地工作.这是我的runhell方法的摘录:
public class RunShellScript {
public static void runShellScript (String unixCommand)
{
try {
Runtime runtime=Runtime.getRuntime();
//Process process=runtime.exec(new String [] { "/bin/csh", "-c", unixCommand});
Process process=runtime.exec(new String [] {unixCommand});
InputStream stderr=process.getErrorStream();
InputStreamReader isr=new InputStreamReader (stderr);
BufferedReader br=new BufferedReader (isr);
String line=null;
System.out.println("<ERROR>");
while((line=br.readLine())!=null)
System.out.println(line);
System.out.println(line);
int exitVal=process.waitFor();
System.out.println("Process exitValue:" + exitVal);
}
catch (Throwable t)
{
t.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我把它放在鼠标点击事件后面时,它说命令未找到.这是代码beuind the mous事件
private void jMenuItem13MousePressed(java.awt.event.MouseEvent evt) {
String shellCommand="vobs/tools/Scripts/DataValidation/mysqlconnection.csh";
RunShellScript.runShellScript(shellCommand);
// TODO add your handling code here:
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我直接进入脚本所在的目录并输入./mysqlconnection时,脚本可以工作.但是,当我只是键入mysqlconnection时,说找不到命令.不知怎的,它没有将我的脚本名称识别为命令?
受关于函数而不是宏的相关问题的评论主题的启发.
有没有办法扩展Scheme语法定义,以便它可以使用新定义中语法的先前定义?此外,这必须是可扩展的,也就是说,必须能够将技术链接在一起几次.
例如,假设我们想要扩展,lambda以便每次调用定义的函数时lambda,它在执行函数体之前打印"foo".我们可以通过以下方式执行此操作:
(define-syntax old-lambda lambda)
(define-syntax lambda
(syntax-rules ()
((_ args body ...)
(old-lambda args (display "foo") body ...))))
Run Code Online (Sandbox Code Playgroud)
我们还可以通过以下方式以另一种方式扩展它(例如,通过打印"bar"):
(define-syntax old-lambda-2 lambda)
(define-syntax lambda
(syntax-rules ()
((_ args body ...)
(old-lambda-2 args (display "bar") body ...))))
Run Code Online (Sandbox Code Playgroud)
最终结果是使用new定义的函数lambda将打印"foo",然后每次调用它们时都会显示"bar".
但是,除了用大量的方法来污染命名空间之外old-lambda-<x>,old-lambda-<x>每次我们这样做时都需要在源代码级别创建一个新的; 这不能自动化,因为您也不能gensym在语法定义中使用.因此,没有好的方法可以实现这种可扩展性; 唯一可行的解决方案是命名每个old-lambda-print-foo或类似的消歧,这显然不是一个万无一失的解决方案.(有关这可能失败的示例,请说代码的两个不同部分是扩展lambda为打印"foo";当然,它们都会命名它old-lambda-print-foo,瞧!lambda现在是无限循环.)因此,它会非常很高兴,如果我们能够以理想的方式做到这一点:
old-lambda-<x>有没有人知道在计划中编写控制台应用程序(例如基本动画)的任何半便携方式?我听说过一个ncurses包装,但我找不到任何东西.
我被告知以下表达式旨在评估为0,但Scheme的许多实现将其评估为1:
(let ((cont #f))
(letrec ((x (call-with-current-continuation (lambda (c) (set! cont c) 0)))
(y (call-with-current-continuation (lambda (c) (set! cont c) 0))))
(if cont
(let ((c cont))
(set! cont #f)
(set! x 1)
(set! y 1)
(c 0))
(+ x y))))
Run Code Online (Sandbox Code Playgroud)
我必须承认,我不知道从哪里开始.我理解延续的基础知识call/cc,但是我可以得到这个表达式的详细解释吗?
在这里问它很痛.确实如此.每次我徒劳地寻找我的烦恼的答案,我都会看到它.嘲弄我.堆栈溢出.
无论如何,一些地狱般的影响使我试图解决河内塔.我的第一个解决方案是不完整的,因为如果运行太多磁盘会导致内存错误:
(define hanoi
(lambda (n from to other)
(cond ((< n 0)
(error `(Error! Number of disks ,n cannot be less than 0!)))
((= n 0)
'())
(else
(append (hanoi (- n 1)
from
other
to)
`((,from ,to))
(hanoi (- n 1)
other
to
from))))))
Run Code Online (Sandbox Code Playgroud)
我在某处读到延续传递方式可以解决问题.但是,这也无济于事:
(define hanoi_cps
(lambda (n from to other c)
(cond ((< n 0)
(error `(Error! Number of disks ,n cannot be less than 0!)))
((= n 0)
(c …Run Code Online (Sandbox Code Playgroud) 我正在开发加密工具,对于我们的加密文件格式,我使用Base64来编码数据.我正在使用apache commons编解码器使用围绕FileInputStream的Base64InputStream来解码文件.在我在大型音乐文件上测试之前,这就像一个魅力.出于一些神秘的原因,当我这样做时,字节6028之后的每个字节变为0.将其读入byte []的代码如下:
FileInputStream filein = new FileInputStream(filename);
Base64InputStream in = new Base64InputStream(filein,false,76,'\n');
byte[] contents = new byte[known_and_tested_correct_filelength];
in.read(contents);
Run Code Online (Sandbox Code Playgroud)
现在,无论出于何种原因,在字节6028之后,所有内容contents都是0.但是,contents.length大约是300,000字节.你可以猜到,这对我的应用程序来说确实很奇怪.有没有人知道发生了什么?
在方案中,可以使用set!创建两个(或更多)函数,它们之间共享一个私有范围:
(define f1 #f) ; or any other "undefined" value
(define f2 #f)
(let ((private some-value) (another-private some-other-value))
(set! f1 (lambda ... <use of private variables> ...))
(set! f2 (lambda ... <use of private variables> ...)))
Run Code Online (Sandbox Code Playgroud)
或者使用第三个变量:
(define functions
(let ((private some-value) (another-private some-other-value))
(list (lambda ... <use of private variables> ...)
(lambda ... <use of private variables> ...))))
(define f1 (car functions))
(define f2 (cadr functions))
Run Code Online (Sandbox Code Playgroud)
然而,由于在第二个中使用set!了第一个和剩下的变量functions,所以这两个看起来都不优雅.有没有办法做到这一点没有?
我在json_aggfor中有多个表psql:
SELECT json_agg(t) FROM (SELECT *,
( SELECT row_to_json(b) FROM ( SELECT * from (SELECT *, ( (3959 * acos( cos( radians(6.414478) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(12.466646) ) + sin( radians(6.414478) ) * sin( radians( lat ) ) ) ) * 1.609344 ) AS distance
from farm_location ) al WHERE farm_location_id=supply_forecast.farm_location_id and distance < 100 ) b) as farm_location,
( SELECT json_agg(c) FROM ( SELECT *
FROM …Run Code Online (Sandbox Code Playgroud)