小编lur*_*ker的帖子

图表DB与Prolog(或miniKanren)

最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程.根据我迄今所学到的知识,它们都允许指定它们之间的事实和关系,并且还可以查询生成的系统以进行某些选择.所以,实际上我看不出它们之间的差别很大,因为它们都可以用来构建图形并查询它,但是使用不同的语法.但是,它们是完全不同的软件.

除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?

prolog neo4j graph-databases minikanren

20
推荐指数
3
解决办法
2371
查看次数

在GNU-Prolog中,我能"抓住"linux信号吗?

有没有办法在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的解决方案,如果可能的话.

linux prolog gnu-prolog

20
推荐指数
2
解决办法
352
查看次数

(GNU)Forth局部变量行为

我刚刚在Forth中学习了单词定义的局部变量.我碰巧使用GNU Forth(gforth).我正在查看问题和答案,Forth局部变量分配变量,并且正在努力解决给定答案的行为.当我尝试它时,我得到了一个下溢,除非我有四个单元格在堆栈上.

考虑这个简单的例子:

: foo { a b } a b + . ;
Run Code Online (Sandbox Code Playgroud)

这个词将采取前两名堆的电池,将它们存储在本地变量ab,把ab(按顺序)回栈上,添加它们,流行音乐和显示结果,并发出一个回车.它按照我的预期工作,在完成时不会在堆栈上留下任何内容:

: 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.这个词会采取前两名堆的电池,将它们存储在本地变量ab,把ab(按顺序)回栈上,添加它们,弹出的结果,它在存储c,推c …

forth local-variables

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

Prolog性能和递归类型

我正在玩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)

因此,非尾递归方法非常实时有效.

一个特定的递归类型通常更实时有效,所有其他条件相同(我知道这并不总是一个简单的前提)?这个实验告诉我的是,我可能不想总是努力进行尾递归,但我可能需要首先进行性能分析,然后权衡性能优势与尾递归确实具有的其他好处.

performance tail-recursion list permutation prolog

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

Lisp: advanced string comparison

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 …

lisp common-lisp

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

在正则表达式替换中捕获字符串

从我从正则表达式的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正则表达式类的一部分?

regex smalltalk pharo

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

prolog中数据管理的最佳实践

我刚刚参与使用Prolog来处理的不仅仅是最简单的数据形式(事实),而且正在寻找经验丰富的Prologers的一些指导......

如果我想动态管理数据或事实,我有几个主要选择,例如:

  • 在Prolog,OR中将数据作为断言进行管理
  • 与Prolog,OR的数据库接口
  • 可能是两者的结合

如果我将事实作为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中手动(显式)执行此操作似乎很麻烦,那么这通常如何完成?或者我的假设是正确的?

database prolog inference-engine

9
推荐指数
3
解决办法
2976
查看次数

用Lisp编写正式的语言解析器

我的公司正在设计一种新的特定于域的脚本语言; 我必须实现一个解析器,将我们全新的编程语言转换为通用的脚本语言,以便能够实现它.

我这样做的通常方法是通过生成翻译器代码的工具BisonFlex工具C/C++.

对于大多数主流编程语言,我找到了其他工具,但没有找到Lisp.

没有Lisp曾经被使用是什么?编写解析器的常用方法是什么Lisp

注意:对我来说,任何Lisp可能有帮助的实现/方言都可以,我没有任何偏好.

lisp scheme formal-languages racket

9
推荐指数
3
解决办法
4653
查看次数

没有基址寄存器,qword ptr [hexvalue]是什么意思

我在汇编中调试了CLR代码,并且排成一行

mov rax, qword ptr [ff4053c0h]
Run Code Online (Sandbox Code Playgroud)

我想qword ptr [ff4053c0h]是指我感兴趣的字符串,但ff4053c0h不是有效的内存位置.阅读qword ptr它似乎引用了一个基于基址寄存器的地址(例如qword ptr [rsp+30h],堆栈中有30个字节),但是我找不到没有基址寄存器的含义.

assembly .net-assembly

9
推荐指数
2
解决办法
1万
查看次数

Rails使用子文件夹进行路由

我有我的视图文件夹的这种结构(它们显示logis结构):

DIR

所以我在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)

routing ruby-on-rails

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