标签: rewriting

重写为GHC中的实用优化技术:它真的需要吗?

我正在阅读Simon Peyton Jones等人撰写的论文.命名为"遵循规则:重写为GHC中的实用优化技术".在第二部分,即他们写的"基本思想":

考虑熟悉的map函数,它将函数应用于列表的每个元素.写在Haskell中,map看起来像这样:

map f []     = []
map f (x:xs) = f x : map f xs
Run Code Online (Sandbox Code Playgroud)

现在假设编译器遇到以下调用map:

map f (map g xs)
Run Code Online (Sandbox Code Playgroud)

我们知道这个表达式相当于

map (f . g) xs
Run Code Online (Sandbox Code Playgroud)

(其中"."是函数组合),我们知道后一个表达式比前者更有效,因为没有中间列表.但是编译器没有这样的知识.

一个可能的反驳是编译器应该更聪明---但程序员总是会知道编译器无法弄清楚的事情.另一个建议是:允许程序员将这些知识直接传递给编译器.这是我们在这里探索的方向.

我的问题是,为什么我们不能让编译器变得更聪明?作者说"但程序员总是会知道编译器无法弄清楚的东西".但是,这不是一个有效的答案,因为编译器确实可以找出map f (map g xs)相当于的map (f . g) xs,这里是如何:

map f (map g xs)
Run Code Online (Sandbox Code Playgroud)
  1. map g xs与...结合map f [] = [].

    因此map g [] = [].

  2. map f (map g …

optimization haskell ghc compiler-optimization rewriting

26
推荐指数
2
解决办法
706
查看次数

基于术语重写的评估如何运作?

Pure编程语言显然基于术语重写,而不是传统上类似外观语言的lambda演算.

......这会产生什么质的,实际的差异?其实,什么的,因为它计算表达式的方式有什么区别?

所链接的页面提供了很多项重写的例子是有用的,但它实际上并没有描述什么是从功能应用确实有所不同,除了因为它出现在Haskell和ML是好的,它有相当灵活的模式匹配(和模式匹配,但不是评估策略的基础).值与定义的左侧匹配并替换为右侧 - 这不仅仅是β减少吗?

模式的匹配和输出表达的替换,表面看起来有点像syntax-rules我(甚至是卑微的#define),但其主要特征显然是它发生在之前而不是评估期间,而Pure是完全动态的,有在其评价体系没有明显的相分离(实际上否则Lisp的宏系统一直由他们如何是一个很大的噪音不是从功能应用的不同).能够操纵符号表达式值很酷,但也看起来像动态类型系统的工件,而不是评估策略的核心(非常确定你可以重载Scheme中的运算符来处理符号值;事实上你甚至可以使用表达式模板在C++中完成它.

那么术语重写(由Pure使用)和传统功能应用程序之间的机械/操作差异是什么,作为评估的基础模型,当两者都发生替换时?

evaluation functional-programming rewriting

13
推荐指数
1
解决办法
1493
查看次数

在位向量算法的决策过程中使用术语重写

我正在研究一个项目,其重点是使用术语重写来解决/简化固定大小的位向量算术问题,这对于某些决策程序(例如基于钻头爆破的程序)的先前步骤是有用的.术语重写可以完全解决问题,或者产生更简单的等效问题,因此两者的组合可以导致相当大的加速.

我知道许多SMT求解器实现了这种策略(例如Boolector,Beaver,Alt-Ergo或Z3),但很难找到详细描述这些重写步骤的论文/技术报告/等.一般来说,我只发现了作者在几段中描述这种简化步骤的论文.我想找一些文件详细解释术语重写的用法:提供规则的例子,讨论AC重写和/或其他等式公理的便利性,重写策略的使用等.

目前,我刚刚找到了技术报告"固定宽度位向量的决策程序",描述了CVC Lite执行的规范化/简化步骤,我想找到更多这样的技术报告!我还发现了一张关于STP术语重写的海报,但这只是一个简短的总结.

我已经访问了那些SMT求解器的网站,我在他们的出版物页面中搜索过......

我将不胜感激任何参考,或任何有关如何在当前版本的知名SMT求解器中使用术语重写的解释.我对Z3特别感兴趣,因为它看起来有一个最聪明的简化阶段.例如,Z3 3.*引入了一个新的位向量决策程序,但遗憾的是,我无法找到任何描述它的论文.

bitvector rewriting smt z3

8
推荐指数
1
解决办法
1059
查看次数

LYAH - 在链接 Writer monad 时理解关于“告诉”的评论

问题在底部以粗体显示。

LYAH 给出了这个使用monaddo符号的例子Writer

import Control.Monad.Writer

logNumber :: Int -> Writer [String] Int
logNumber x = writer (x, ["number " ++ show x])

multWithLog :: Writer [String] Int
multWithLog = do
              a <- logNumber 3
              b <- logNumber 5
              return (x*y)
Run Code Online (Sandbox Code Playgroud)

定义可以在没有do符号的情况下重写:

multWithLog = logNumber 3 >>= (\x ->
              logNumber 5 >>= (\y ->
              return (x*y)))
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

之后,书中介绍了tell,并编辑了这样的定义multWithLog

multWithLog = do
              a <- logNumber 3
              b <- logNumber 5
              tell ["something"]
              return …
Run Code Online (Sandbox Code Playgroud)

monads haskell rewriting do-notation writer-monad

8
推荐指数
1
解决办法
88
查看次数

我是否需要编写自己的非托管IL库来使用CLR Profiling API重写IL?

我一直在查看CLR Profiling API的一些文章,其中许多文章都讨论了调用SetILFunctionBody()来进行实际的IL重写; 但是,这些文章中没有一个实际上解释了您可以用来重写实际方法IL字节的确切内容.是否有一个非托管的库可以让我写IL,还是我必须自己写一个?

.net profiling cil rewriting clr-profiling-api

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

如何使用Coq中的Rmult重写Rle中的Rle?

关于关系Rle(<=),我可以在Rplus(+)和Rminus( - )内重写,因为两个二元运算符的两个位置都有固定的方差:

Require Import Setoid Relation_Definitions Reals.
Open Scope R.

Add Parametric Relation : R Rle
reflexivity proved by Rle_refl
transitivity proved by Rle_trans
as Rle_setoid_relation.

Add Parametric Morphism : Rplus with
signature Rle ++> Rle ++> Rle as Rplus_Rle_mor.
intros ; apply Rplus_le_compat ; assumption.
Qed.

Add Parametric Morphism : Rminus with
signature Rle ++> Rle --> Rle as Rminus_Rle_mor.
intros ; unfold Rminus ;
apply Rplus_le_compat;
[assumption | apply Ropp_le_contravar ; …
Run Code Online (Sandbox Code Playgroud)

relation coq rewriting

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

使用libnetfilter_queue动态重写网络数据包

我正在尝试编写一个可以挂钩到操作系统网络堆栈的用户空间应用程序,嗅探飞过的数据包并编辑它感兴趣的数据包.

经过大量的谷歌搜索,在我看来,这样做(在任何平台上)最简单(但相当合理)的方法是Linux的libnetfilter_queue项目.但是,在有限的官方文档之外,我无法找到项目的任何合理文档.它的主要特征(如第一个链接所述)

  • 从内核nfnetlink_queue子系统接收排队的数据包
  • 发出判决和/或将更改的数据包重新注入内核nfnetlink_queue子系统

重点是我自己的.我的意思到底是怎么回事?我已经尝试修改提供的示例代码,但也许我误解了一些东西.该代码在运行NFQNL_COPY_PACKET模式,所以我接收到整个数据包-但我的修改,它似乎被限制在自己的应用程序-正如人们所期望的那样,给予"复制"语义.

我的感觉是,我打算以NF_QUEUE某种方式使用它,但我还没有完全理解它.有什么指针吗?

(如果有一个更简单的机制来实现这一点,这也是跨平台的,我很乐意听到它!)

networking netfilter rewriting

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

重写多个 URL

我正在尝试重写不同的 URL。前三行有效,但较低的行无效。我收到 500 内部服务器错误。我的 htaccess 文件的一个片段:

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^word/(.*)$ word.php?word=$1 [QSA]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^/en/word/(.*)$ /en/word.php?word=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,那就太好了,因为我找不到解决方案。我究竟做错了什么?

问候, 安德烈亚斯

apache url .htaccess mod-rewrite rewriting

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

PIL图像转换不使用文件系统

我想用PIL进行图像转换/重写,只需使用RAM内存.我在RAM中有以字节为单位的图像,我想将其转换为其他格式或可能相同.我知道我可以将其保存在具有某些名称的文件系统上,但我想只使用RAM而不触及文件系统.我没有找到任何例子.任何帮助,将不胜感激!谢谢!

python rewriting python-imaging-library

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