问题标签 [dcg]
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.
java - 语义网中的 SWI-Prolog
我想听听那些在使用 SWI-Prolog 的语义库方面有实际编程经验的人的意见。
编辑:这个问题的原因是,在与我交谈过的许多有 prolog 经验的人中,他们中的大多数人似乎在他们的学术项目中将它用于一些 AI 编程。我想知道是否有人在生产环境中广泛使用它。因为实时可维护性,性能不同于完成项目以获得好成绩。
您是如何与 Java 等编程语言集成的?
编辑:如答案中所述,似乎 REST 服务或使用 SWI-Prolog 的外部接口是两个最佳选择。
您将 prolog 库用于什么(在语义网络的上下文中)?
可能不会在这里得到明确的答案。可能,这个问题属于语义溢出。我现在有一个合理的想法,并将在更合适的论坛上继续讨论。
使用的是什么开发环境? SWI-Prolog 提供的 Emacs 或其变体似乎是压倒性的答案。
我从不想要一个像 Intellij IDEA for java 这样的 IDE。毕竟我会怎么做,自动完成?我理解基于规则的语言的必要性。再说一次,我讨论开发环境的原因是为了帮助我跟踪我的规则(调试),也可能识别我知识集中的异常。SWI-Prolog 的图形跟踪器满足了第一个要求,但至少在我看来,它显得粗制滥造和有限。但我不相信还有别的。
我真的很喜欢使用 SWI-Prolog 的想法,但如果它影响生产力,我会避开它。
正如答案中提到的,应该使用 Prolog 来执行它擅长的事情。我一直都知道这一点,因此我对与其他编程语言的集成提出了疑问。似乎最大的生产力猪是开发人员的质量,并且处于开发阶段。系统中的问题可能处于休眠状态且不易修复,但可以通过使用一组问题来检查系统的有效性来处理。
注意:当我提到答案时,我指的是@littletable 提供的答案。同样对于对语义网 SWI-Prolog 感兴趣的人来说,thea看起来很有趣。
prolog - Prolog 的 DCG 问题
该项目是关于将半自然语言转换为 SQL 表。编码:
以下是它的工作原理:
但它在这里不起作用:
显然它不认为table("student")
是真的。如上所示,它将“学生”识别为标签。是什么赋予了?
prolog - 如何让Prolog的DCG不贪心?
我想编写一个 DCG 谓词,它将接受一个字母标签、一个空格、一个可能包含空格或字母的伪标签、另一个空格和另一个字母标签,最后是一个句点,如下所示:
这是标签的代码:
现在,当我label_madness
输入类似 的字符串时"Alice is responsible for Bob."
,它会失败。由于神秘的原因trace
拒绝工作,但我认为它失败了,因为 DCG 匹配整个is responsible for Bob
for Rel
。我尝试在标签之间使用非空格分隔符,效果很好。我应该如何重写label_with_spaces
谓词以仅消耗所需的输入?
perl - Prolog 作为 DSL 生成 perl 代码?
有谁知道用 prolog 编写的代码示例以实现 DSL 以生成 perl 代码?
prolog - 从序言结构中提取单词
我已经在 Prolog 中设置了自然语言解析的任务。到目前为止,我的程序在一定程度上工作。到目前为止, sentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat))))))
如果我输入一个列表,它会打印出来[the,cat,sat,on,the,mat]
,这很好。
我接下来要做的任务是从句子中提取关键字,即提取名词短语中的名词、动词短语中的动词和动词短语中的名词,这样我就可以返回一个列表:[cat,sat ,垫]。任何人都可以帮我开始,因为我非常坚持这一点。谢谢!
我当前的代码是:
prolog - 断言和撤回以模拟全局变量
我这样做是为了模拟全局变量:
还有其他方法吗?(除了将变量作为参数传递之外)。不一定更有效率,我只是好奇。
prolog - Prolog 问题 - 简单的语法实现
如果我有以下语法:
如何在 Prolog 中实现它?
我试过这个:
但这显然不起作用,因为列表的头部不能是列表。
然后我尝试实现一个新版本,如下所示:
但是对于 input isMatched([a,b,a])
,它用完了堆栈。
我该如何解决?
prolog - 使用 Prolog DCG 拆分字符串
我正在尝试使用 DCG 将字符串拆分为由空格分隔的两部分。例如,'abc def' 应该还给我“abc”和“def”。程序和DCG如下。
这可以正常工作。但我发现必须输入[ P1 | Part1 ]
&[ P2 | Part2 ]
真的很冗长。因此,我尝试在 的定义中替换所有[ P1 | Part1 ]
w/ Part1
& 同样 w/的实例,即以下内容。[ P2 | Part2 ]
data
这更容易输入,但这给了我一个Arguments are not sufficiently instantiated
错误。所以看起来未绑定的变量不会自动解释为 DCG 中的代码列表。有没有其他方法可以减少冗长?我的意图是在其他编程语言中使用正则表达式的地方使用 DCG。
debugging - 在 SWI-prolog 中调试 - 未绑定的变量
考虑以下 Prolog 代码。它在其输入中编辑特定类型的行并打印出剩余的行而不进行任何更改。它使用了一个名为 DCG 的名称rule
,它没有包含在下面,因为它对这个问题并不重要。
这工作正常。但是,假设我更改processInput/1
为以下内容,它只是说Warning: /home/asfernan/tmp/tmp.pl:28: Goal (directive) failed: user: (go,halt)
.
DCG 匹配的 if & else 部分phrase(rule(Part1, Part2), Codes)
已交换。这显然是一个新手错误,但失败的事实go, halt
并不是很有帮助。我该怎么做才能使错误消息表明失败是因为Part1
&Part2
没有绑定format('~s - ~s\n', [ Part1, Part2 ])
在行中?由于代码很小,我能够追踪到这个错误,但如果代码很大,我可能无法做到这一点。
parsing - 在序言中解析
在这个解析器中,当给定增加时它打印 1,当给定减少时打印 0。但是,在处理列表的最后一个元素时会出现问题。例如run(A,[increase],[])
打印两个 1。run(A,[increase,decrease],[])
打印一个 1 和两个 0,这是我不想要的。我怎样才能使它正常工作,以便run(A,[increase],[])
打印 1 并run(A,[increase,decrease],[])
打印 1,0 ?