我想问一下从头开始/逆向工程师实施什么样的正式系统会更有趣.
我查看了一些逻辑/声明性编程系统的现有和开源项目.我决定在空闲时间编写类似的内容,或者至少要了解实现的一般概念.
如果这些系统中的一些能够提供逻辑中现代学术研究的大部分表达能力和简洁性以及它与计算模型的关系,那将是很好的.
你建议至少在概念层面学习什么?例如,Lambda-Prolog很有意思,因为它允许更高阶的关系,但AFAIK基于直觉主义逻辑,因此缺乏排除中间原则; 这通常对我不利.
我也欢迎任何有关现代逻辑编程系统的建议,这些系统不太受欢迎,但更具表现力/强大功能.
我目前需要在我正在制作的应用程序中执行prolog代码.我知道Apple可能永远不会在App Store中允许这样的东西,但这也不是意图.这是一个永远不会到达App Store的私人项目.
目的
在这种情况下,prolog用于描述对象(例如电话)及其属性.将使用prolog脚本中指定的坐标使用OpenGL绘制对象.使用prolog的原因是我需要能够向程序查询该对象具有的一些功能,并且对此进行了大量修改.结论:我"需要"从我的应用程序查询prolog脚本.
可能的解决方案
可悲的是,谷歌让我几乎没有任何结果,所以我觉得我可能在这个项目上很孤单.如果有人有任何经验或线索,我会非常感激.
我在某处看到,Scala中匹配/案例功能支持的模式匹配实际上是从Prolog这样的逻辑语言中借用的.
您能否使用Scala优雅地解决连接图问题等问题?例如https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html
language-features programming-languages scala prolog logic-programming
我正在从LearnYouSomeErlang网络书籍学习Erlang.在学习的过程中,有一件事让我印象深刻的是非短路布尔连接和分离算子即可; and和or.这些运营商有哪些用例?你为什么要用它们而不是andalso和orelse?
erlang programming-languages functional-programming logic-programming
是否有比Prolog更专用于逻辑编程的新语言?
我有一个有趣的问题,但我不确定如何用它来表达...
考虑lambda演算.对于给定的lambda表达式,有几种可能的缩减顺序.但其中一些不会终止,而另一些则会终止.
在lambda演算中,事实证明存在一个特定的减少顺序,如果实际存在,则保证总是以不可简化的解决方案终止.它被称为正常秩序.
我写了一个简单的逻辑解算器.但麻烦的是,它处理约束的顺序似乎对它是否找到任何解决方案产生了巨大影响.基本上,我想知道我的逻辑编程语言是否存在类似正常顺序的东西.(或者说,单纯的机器无法确定地解决这个问题.)
这就是我所追求的.据推测,答案关键取决于"简单逻辑解算器"到底是什么.所以我将尝试简要描述一下.
我的节目紧密地基于编程乐趣(Jeremy Gibbons&Oege de Moor)第9章中的组合系统.该语言具有以下结构:
求解器的输入是单个谓词.谓词可能涉及变量.求解器的输出为零或更多解.解决方案是一组变量赋值,它使谓词成为正确.
变量持有表达式.表达式是整数,变量名或子表达式的元组.
有一个等式谓词,用于比较表达式(不是谓词)的相等性.如果用其值替换每个(绑定)变量使两个表达式相同,则会感到满意.(特别是,每个变量都等于它自己,绑定与否.)这个谓词是使用统一来解决的.
还有AND和OR的运算符,它们以明显的方式工作.没有NOT运算符.
有一个"存在"运算符,它基本上创建局部变量.
定义命名谓词的工具支持递归循环.
关于逻辑编程的一个"有趣的事情"是,一旦你编写了一个命名谓词,它通常会向前和向后(有时甚至是横向).典型示例:用于连接两个列表的谓词也可用于将列表拆分为所有可能的对.
但有时向后运行谓词会导致无限搜索,除非您重新排列术语的顺序.(例如,交换一个AND的LHS和RHS或者一些OR.)我想知道是否有一些自动方法来检测运行谓词的最佳顺序,以确保在解决方案集完全正确的所有情况下立即终止有限.
有什么建议?
一些core.logic构建体(matcha,matche,matchu,defne,fne)使用模式匹配表达式作为体并且可以使用,例如:
(run* [q]
(fresh [a o]
(== a [1 2 3 4 5])
(matche [a]
([ [1 2 . [3 4 5] ]]
(== q "first"))
([ [1 2 3 . [4 5] ]]
(== q "second"))
([ [1 . _] ]
(== q "third")))))
;=> ("first"
; "second"
; "third")
Run Code Online (Sandbox Code Playgroud)
(来自Logic-Starter wiki的示例)
但是我在core.logic文档中找不到模式匹配的语法规范.这是什么语法?也许我可以在一些minikanren文档或书籍中找到它?
?和不带前缀的匹配变量有什么区别?.(类似于&clojure)?[_ _]匹配有两个元素只有序列?有没有好的非Prolog或Prolog的逻辑编程语言?
谁拥有或有任何良好的经验?
Prolog中列表处理的典型代码示例是append:
append([], Ys, Ys).
append([X | Xs], Ys, [X | Zs]) :- append(Xs, Ys, Zs).
Run Code Online (Sandbox Code Playgroud)
我的问题是这个程序是否是尾递归的.我想不是我在函数式语言方面的经验.但是,我觉得判断Prolog程序更加困难.我们似乎必须考虑统一.
我对Prolog的力量感到非常惊讶.花了一些时间来解决问题,但对我来说,它似乎是那里最酷的声明性语言.这就是为什么最近,在使用Scala进行了两年的函数式编程之后,我决定再次看一下逻辑编程,以"训练我的大脑"或更好地实际使用.
结合功能和逻辑编程似乎对我学习/巩固两种声明范式的概念很有吸引力.我发现强力型系统非常有用且引人入胜.
Scala真的与interop一起闪耀.我们不要重新发明轮子.它应该能够用另一种主要语言调用代码,并且最好也可以调用.但它不一定是Java.C或Haskell也可以.
那么,今天最有用和最具启发性的FLP语言,您对它们的看法和建议是什么?
这是我到目前为止发现的:
水星:声称是快速,强类型的Prolog.纯粹的声明,但没有逻辑变量!没有约束编程?似乎是使用最广泛的FLP.互操作?
库里:看起来很有前途,也是最先进的,但现在文档上有点低."实验"是否意味着不成熟/不准备潜入?只是基于Haskell或实际上与Haskell的良好互操作?
Ciao:似乎提供了我想要的许多功能,但Stack Overflow似乎根本不知道它,虽然它自1984年以来就存在了?它出什么问题了?互操作?
drools(java library/DSL):声称它允许混合前向和后向链接.成熟.直接与Java/Scala互操作,但依赖于可变数据/命令式构造?它与功能JVM语言的集成程度如何?
miniKanren:实现存在于多个平台上.如何互操作?高效?
Lambda Prolog实现,例如:
良好但理论上的阅读并偏向于咖喱,而不是解决实际问题: