问题标签 [functional-logic-progr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pattern-matching - Curry 中逆组合器/运算符的紧凑与完整/详细定义
Wolfgang Jeltsch撰写的关于基于 Haskell 的KiCS2实现Curry的相当引人入胜的 2013 年介绍性文章A Taste of Curry为组合器提供了以下定义inverse
:
(注意:对于不熟悉库里的路人来说,这会做类似inverse (+1) 3 == 2
and inverse (*3) 12 == 4
and之类的事情,以及无数其他令人难以置信的很棒的事情)inverse htmlHodeToStr == parseHtmlNode
此外,它还提供了 2 个替代但等效的(非确定性)split :: [a] -> ([a], [a])
函数定义:
和
以及其他一些颇具启发性的定义,但是超出了本文的范围。
然而,我的想法使我尝试了一种替代的、紧凑的定义,inverse
本着split
and的精神split'
:
另一方面,这会导致以下错误:
我的问题:为什么 Curryf
将潜在功能模式中的 in解释(f x)
为数据构造函数,而++
将(也是功能性)模式中的 in 解释(xs ++ ys)
为函数名称?
换句话说,xs
and ys
insplit' (xs ++ ys) = (xs,ys)
似乎与 in 完全x
类似inverse' f (f x) = x
。
或者,如果与的类比split'
不是很明显,请考虑prefix (xs ++ _) = xs
等等orig (1 + x) = x
,它们都可以编译和运行。
PS与原始帖子相比,我对名称和类型签名进行了一些调整,以使这个问题更容易理解。
parsing - 生成带有“逆”的解析器,对语法有约束
我最近完成了A Taste of Curry,然后决定通过编写一个更充实的解析器来测试这个简单的算术解析器示例:一个原始但正确且功能强大的 HTML 解析器。
我最终得到了一个node2string
可以操作的工作函数Node
(带有属性和子项),然后我inverse
将获得一个parse
函数,如文章中所示。
第一个幼稚的实现有一个错误,即它解析除了琐碎的<input/>
HTML 片段之外的任何东西都只是一个Node
表示。其他一切都不确定地产生了无效的东西,比如
等等。
经过一些最初的天真尝试从内部解决该问题后node2string
,我意识到了这一点,我相信所有经验丰富的逻辑程序员都会立即看到这一点,这parse = inverse node2string
比我更正确和更深入地了解情况:上述 2 解析结果<input type="submit"/>
确实是2 个有效且可构造的值Node
将导致 HTML 表示。
我意识到我必须限制Node
只允许传入字母 - 不是真的,但让我们保持简单 - 名称(当然也一样Attr
)。在比逻辑程序更基础的设置中(例如与纯声明式编程相比,具有更多手写和“指导性”的常规 Haskell),我会简单地将Node
构造函数隐藏在例如mkNode
哨兵函数后面,但我有这种感觉由于推理引擎或约束求解器的工作方式,在 Curry 中无法正常工作(我可能在这方面错了,实际上我希望是这样)。
所以我最终得到了以下结果。我认为 Curry 元编程(或 Template Haskell,如果 Curry 支持的话)可以用来清理手动样板,但表面处理只是摆脱这种情况的一种方法。
事实上,这非常有效(在我看来):
(Curry 没有类型类,所以我还不知道如何[NameChar]
更好地打印)
但是,我的问题是:
有没有办法使用类似的东西isAlpha
(或者更符合实际 HTML 规范的函数,当然)来实现与此等效的结果,而不必通过冗长的样板NameChar
及其“支持成员”?似乎没有办法在 ADT 中的任何地方放置“功能限制”。
在依赖类型的函数逻辑编程语言中,我只会在类型级别表达约束并让推理引擎或约束求解器处理它,但在这里我似乎不知所措。
hardware - 如何设计一个仅使用与非门启用的 2-1 多路复用器?
所以,我设法设计了一些东西,但我需要确认,我真正的问题如下:
如何使用问题标题中设计的 2 个多路复用器(仅使用 NAND)以及我需要的任意数量的 NOR 门来设计 4-1 多路复用器?
总而言之,第一个问题:如何仅使用 Nand 门来设计 2-1。第二个问题:如何使用第一个问题的两个电路加上我需要的尽可能多的 NOR 门来设计 4-1。
谢谢
prolog - 关于溯因逻辑编程与答案集编程的讨论
我希望澄清关于溯因逻辑编程与答案集编程的一些事情。
我和一些同学正在创建一个游戏。在这个游戏中有“英雄”(特殊的NPC)。英雄有目标和行为。
(所有这些都是故事驱动的)我希望英雄对玩家或其他英雄的行为做出什么反应,然后决定从那里做什么。
一位老师告诉我们一篇名为“RoleModel: Towards a Formal Model of Dramatic Roles for Story Generation”的论文,它解释了溯因逻辑编程。通过我的研究,我发现了答案集编程。
问题:ALP 范式和 ASP 范式之间有区别吗?就我的目的而言,一个比另一个更好吗?还有其他选择吗?
clojure - 需要澄清理解自定义 core.logic 约束
我试图理解core.logic
如下定义的自定义约束,
如何解释_
和.
在上下文中core.logic
?
haskell - Haskell:组合存在量词和全称量词意外失败
我正在尝试使用 GHC 版本 8.6.5 在 Haskell 中对以下逻辑含义进行建模:
(∀ a. ¬ Φ(a)) → ¬ (∃ a: Φ(a))
我使用的定义如下:
在这里,GHC 拒绝执行,theorem
并显示以下错误消息:
我真的不明白为什么 GHC 不能匹配这两种类型。以下解决方法编译:
对我来说,这两种实现theorem
是等价的。为什么GHC只接受第二个?
functional-programming - 从术语/目标列表中查找成功次数
如果列表中的数字exactly/2
恰好等于 1 ,我编写了以下谓词:N
L
例如,调用exactly(X, [1, 0, 0, 1, 0, 1])
将绑定X
到3
.
N
我想创建类似的东西,但对于谓词:如果列表中的目标完全成功,我想编写一个成功的谓词L
。
例如,调用exactly(X, [true, false, member(1, [1, 2, 3]), member(0, [1, 2, 3])])
应该绑定X
到2
.
functional-programming - 在咖喱(PAKCS)中反转“成员”没有答案
有了这个定义:
PAKCS 2.0.1(来自 Ubuntu 18.04)没有给出答案、警告或错误:
我希望看到 3 个值。我在这里做错了什么?
functional-programming - If & Else & SML 中的模式匹配?
我一直在尝试编译这段代码 3 个小时,但没有任何改进。我知道我的数据类型编译没有问题,也是模式匹配的第一种情况。但是当第二种情况出现时(一个带有两个子节点的节点)它不会编译。这些问题似乎符合 if 和 4 个条件。
我试过,通过将四个条件分解成另一种方式
也可以工作(我认为因为 let in 具有返回类型单元,而其他布尔)