最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程.根据我迄今所学到的知识,它们都允许指定它们之间的事实和关系,并且还可以查询生成的系统以进行某些选择.所以,实际上我看不出它们之间的差别很大,因为它们都可以用来构建图形并查询它,但是使用不同的语法.但是,它们是完全不同的软件.
除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?
有没有办法在GNU Prolog中"陷阱"(例如"捕获")操作系统信号?(我正在使用Ubuntu/Linux,最新的gprolog).
我想很久以前我在WAMCC中使用过这种方法,然后才变成GNU Prolog:
:- catch(Long_Running_Goal,signal(2),write('program interrupted'))
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用(重复,失败)无限循环测试它,例如
:- catch((repeat,fail),X,write(X)).
Run Code Online (Sandbox Code Playgroud)
在解释按Ctrl-C还带我去跟踪/调试器,编译后的程序只是退出,如果我打断它kill -1
,kill -2
等等.
我已经尝试编译程序,--no-top-level
以防默认顶层以某种方式捕获信号,但这没有任何区别.
SWI-Prolog似乎有一个合适的内置谓词on_signal
,但是我正在寻找gprolog的解决方案,如果可能的话.
我刚刚在Forth中学习了单词定义的局部变量.我碰巧使用GNU Forth(gforth
).我正在查看问题和答案,Forth局部变量分配变量,并且正在努力解决给定答案的行为.当我尝试它时,我得到了一个下溢,除非我有四个单元格在堆栈上.
考虑这个简单的例子:
: foo { a b } a b + . ;
Run Code Online (Sandbox Code Playgroud)
这个词将采取前两名堆的电池,将它们存储在本地变量a
和b
,把a
和b
(按顺序)回栈上,添加它们,流行音乐和显示结果,并发出一个回车.它按照我的预期工作,在完成时不会在堆栈上留下任何内容:
: foo { a b } a b + . cr ; ok
1 3 foo 4
ok
.s <0> ok
Run Code Online (Sandbox Code Playgroud)
现在我想尝试一个本地变量,它不是最初从栈中获取的:
: foo { a b | c } a b + to c c . cr ;
Run Code Online (Sandbox Code Playgroud)
我希望这个行为类似,但使用局部变量c
.这个词会采取前两名堆的电池,将它们存储在本地变量a
和b
,把a
和b
(按顺序)回栈上,添加它们,弹出的结果,它在存储c
,推c …
我正在玩permutation
几个程序,并偶然发现了这个小实验:
置换方法1:
permute([], []).
permute([X|Rest], L) :-
permute(Rest, L1),
select(X, L, L1).
Run Code Online (Sandbox Code Playgroud)
置换方法2:
permute([], []).
permute(L, [P | P1]) :-
select(P, L, L1),
permute(L1, P1).
Run Code Online (Sandbox Code Playgroud)
置换方法3(使用内置):
permute(L, P) :- permutation(L, P).
Run Code Online (Sandbox Code Playgroud)
我知道使用尾递归是一种好习惯,通常使用内置函数应该是有效的.但是当我运行以下内容时:
time(findall(P, permute([1,2,3,4,5,6,7,8,9], P), L)).
Run Code Online (Sandbox Code Playgroud)
我得到了以下结果,这些结果在几次运行中相对一致:
方法1:
% 772,064 inferences, 1.112 CPU in 2.378 seconds (47% CPU, 694451 Lips)
Run Code Online (Sandbox Code Playgroud)
方法2:
% 3,322,118 inferences, 2.126 CPU in 4.660 seconds (46% CPU, 1562923 Lips)
Run Code Online (Sandbox Code Playgroud)
方法3:
% 2,959,245 inferences, 1.967 CPU in 4.217 seconds (47% CPU, 1504539 Lips)
Run Code Online (Sandbox Code Playgroud)
因此,非尾递归方法非常实时有效.
一个特定的递归类型通常更实时有效,所有其他条件相同(我知道这并不总是一个简单的前提)?这个实验告诉我的是,我可能不想总是努力进行尾递归,但我可能需要首先进行性能分析,然后权衡性能优势与尾递归确实具有的其他好处.
I recently encountered this line in some common LISP library code:
(string-equal #1="http://" url :end2 (min (length url) #2=#.(length #1#)))
Run Code Online (Sandbox Code Playgroud)
Here, url
was passed in as a string variable. I understand the purpose of this comparison is to determine if the url
string starts with http://
and it's a case-insensitive compare. I also understand about string-equal
keys, such as :start
and :end
. But the pound sign (#
) items threw me. I can figure most of it out …
从我从正则表达式的Pharo文档中收集的内容,我可以定义一个正则表达式对象,例如:
re := '(foo|re)bar' asRegex
Run Code Online (Sandbox Code Playgroud)
我可以用以下字符串替换匹配的正则表达式:
re copy: 'foobar blah rebar' replacingMatchesWith: 'meh'
Run Code Online (Sandbox Code Playgroud)
这将导致:''meh blah meh'.
到现在为止还挺好.但我想替换'bar'
并单独留下前缀.因此,我需要一个变量来处理捕获的括号:
re copy: 'foobar blah rebar' replacingMatchesWith: '%1meh'
Run Code Online (Sandbox Code Playgroud)
我想要结果:'foomeh blah remeh'
.但是,这只是给了我:'%1meh blah %1meh'
.我也尝试使用\1
,或\\1
,或$1
,或{1}
找来文字字符串替换,例如,'\1meh blah \1meh'
作为一个结果.
我可以在GNU Smalltalk中轻松完成这项工作:
'foobar blah rebar' replacingAllRegex: '(foo|re)bar' with: '%1meh'
Run Code Online (Sandbox Code Playgroud)
但我在Pharo正则表达式文档中找不到任何告诉我如何在Pharo中执行此操作的文档.我也为Pharo正则表达式做过一堆谷歌搜索,但没有发现任何东西.这个功能是RxMatcher类还是其他Pharo正则表达式类的一部分?
我刚刚参与使用Prolog来处理的不仅仅是最简单的数据形式(事实),而且正在寻找经验丰富的Prologers的一些指导......
如果我想动态管理数据或事实,我有几个主要选择,例如:
如果我将事实作为Prolog中的断言来管理,我也有一个代表这些事实的最佳方式的问题.假设我有一个person
名字,姓氏和年龄的人.我可以断言:
person(first_name(_), last_name(_), age(_)).
Run Code Online (Sandbox Code Playgroud)
或隐含假设人的属性是什么:
person(_, _, _). % first name, last name, age
Run Code Online (Sandbox Code Playgroud)
如果我想将一个人与其他人联系起来,我真的需要一个人的钥匙.所以我可能倾向于断言一个人:
person(id(_), ...). % Maintain id as a uniq person key; or done implicitly as above
Run Code Online (Sandbox Code Playgroud)
当然,现在我正在使我的Prolog断言看起来像关系数据库表条目.这让我想知道我是否采取了错误的方法并使事实的表现过于复杂化.
所以,我的问题是:在Prolog中管理中到复杂数据时是否需要考虑一些最佳实践?命名约定是它的一小部分.我读过像Prolog中的assert/retract这样的位是低效的.所以我也想知道如何处理数据组织本身,比如什么时候采用外部SQL数据库而不是Prolog-only表示.
附录
我认为,由于关系数据库使用它们的原因,在关系数据库中使用记录密钥是可取的.这意味着必须保持密钥.对于每种情况,在Prolog中手动(显式)执行此操作似乎很麻烦,那么这通常如何完成?或者我的假设是正确的?
我的公司正在设计一种新的特定于域的脚本语言; 我必须实现一个解析器,将我们全新的编程语言转换为通用的脚本语言,以便能够实现它.
我这样做的通常方法是通过生成翻译器代码的工具Bison
和Flex
工具C/C++
.
对于大多数主流编程语言,我找到了其他工具,但没有找到Lisp
.
没有Lisp
曾经被使用是什么?编写解析器的常用方法是什么Lisp
?
注意:对我来说,任何Lisp
可能有帮助的实现/方言都可以,我没有任何偏好.
我在汇编中调试了CLR代码,并且排成一行
mov rax, qword ptr [ff4053c0h]
Run Code Online (Sandbox Code Playgroud)
我想qword ptr [ff4053c0h]
是指我感兴趣的字符串,但ff4053c0h
不是有效的内存位置.阅读qword ptr
它似乎引用了一个基于基址寄存器的地址(例如qword ptr [rsp+30h]
,堆栈中有30个字节),但是我找不到没有基址寄存器的含义.
我有我的视图文件夹的这种结构(它们显示logis结构):
所以我在admin子文件夹中有子文件夹,在目录文件夹中我必须子文件夹,制造商等(制造商和其他有控制器的视图,只有目录和是空的)
和rails自动生成我这样的路线:
namespace :admin do
namespace :catalogs do
namespace :to do
namespace :manufacturers do
namespace :models do
namespace :types do
resources :articles
end
end
end
end
end
end
namespace :admin do
namespace :catalogs do
namespace :to do
namespace :manufacturers do
namespace :models do
resources :types
end
end
end
end
end
namespace :admin do
namespace :catalogs do
namespace :to do
namespace :manufacturers do
resources :models
end
end
end
end
namespace :admin do
namespace :catalogs do
namespace :to do
resources :manufacturers …
Run Code Online (Sandbox Code Playgroud) prolog ×4
lisp ×2
assembly ×1
common-lisp ×1
database ×1
forth ×1
gnu-prolog ×1
linux ×1
list ×1
minikanren ×1
neo4j ×1
performance ×1
permutation ×1
pharo ×1
racket ×1
regex ×1
routing ×1
scheme ×1
smalltalk ×1