Prolog是最常用的逻辑编程语言。它通过按时间顺序回溯和通过统一的模式匹配来支持非确定性编程。
我想在酒吧环境中实现一个人机语音对话系统,该系统将用户的文本短语作为输入(对给定产品的请求:薯条、可乐、水、咖啡等...... .
我对序言很陌生,我正在尝试编写一个谓词 distance_all(列表,距离列表)。 其输入是包含向量坐标的列表的列表: 输入 = [[1,2,3],[2,3,4],[1,7,3],[...
“Indexing diff/2”的第 7 节讨论了一般具体化,并为具体化列表成员给出了以下定义: memberd_t(X, Es, T) :- l_memberd_t(Es, X, T)。 l_会员...
我正在开发 Prolog DCG 解析器,将字符串标记为特定模式。我的目标是解析像 mul(Number,Number)、do() 和 dont() 这样的标记,同时忽略所有其他模式。 这是我的
通常的append/3是纯粹的,但它为模式(-,+,+)留下了一个选择点: ?- 追加(X, [3], [1,2,3])。 X = [1, 2] ; 错误的。 你是上述结果中的一个选择点,可以从以下例子中看出......
我想计算自定义谓词为真的次数。 例如,我有以下代码: is_man(约翰)。 is_man(亚历克斯)。 ?:-is_man(X)。 X 将返回 john,然后如果我按分号它 w...
所以我的问题是这样的,我有一个谓词repete_el(El,N,L),其中El是一个元素,N是重复的次数,L是包含该元素重复N次的列表。 我的...
在Prolog中,当我在顶层输入如下内容时: X = [a-A, b-B, a-A]。 我使用 - 函子将一些逻辑变量与术语相关联 - 但重要的是,......中的第一对和最后一对
Prolog Water Sort Puzzle Solver 中的意外行为:重复结果、持久状态和 GoalCheck 不一致
我一直在开发一个使用 Prolog 解决水分类难题的副程序。 程序运行正常,但有一些奇怪的可疑行为。 我们将做出以下的构造...
PROLOG 谓词返回 false,否定也返回 false(使用 not)
我设置了以下规则。 pokemonOfType(小火龙,火)。 pokemonOfType(staryu, 水). typeWins(水,火)。 %这不应该影响结果, % 但谁知道呢
我有这个作业,必须用Prolog写。要求是写一段进行二进制加法的代码,例如: ?- 添加([1,0,1],[1,1],X)。 X = [0,0,0,1] 所以,这是...
我定义了具体化的变体 clpfd 约束 (#<)/2, (#=<)/2, (#>=)/2 和 (#>)/2: :- use_module(库(clpfd))。 ltA(X,Y,Truth) :- X #< Y #<==> B, bool01_truth(B,Tr...
如何使用 prolog 创建相同的函数(html 输入到 jsp)
我正在做一个使用prolog与HTML集成的程序,目前一直在理解prolog中的HTTPSESSION,并希望创建与下面的JSP相同的功能。 用户输入的 HTML: ...
我需要编写道义逻辑规则,有没有任何编程语言可以做到这一点?我看到了 prolog,现在正在学习,但是如何在 PROLOG 中表达道义逻辑?请帮忙
我在库(sgml)中找到了谓词 xml_quote_attribute/2 SWI-Prolog 的。该谓词适用于第一个参数 作为输入,第二个参数作为输出: ?- xml_quote_attribute(' 我在库(sgml)中找到谓词 xml_quote_attribute/2 SWI-Prolog 的。该谓词适用于第一个参数 作为输入,第二个参数作为输出: ?- xml_quote_attribute('<abc>', X). X = '<abc>'. 但我不知道如何进行反向转换。 例如,以下查询不起作用: ?- xml_quote_attribute(X, '<abc>'). ERROR: Arguments are not sufficiently instantiated 还有另一个谓词可以完成这项工作吗? 再见 这就是 Ruud 的解决方案,使用 DCG 符号+推回列表/半上下文符号。 :- use_module(library(dcg/basics)). html_unescape --> sgml_entity, !, html_unescape. html_unescape, [C] --> [C], !, html_unescape. html_unescape --> []. sgml_entity, [C] --> "&#", integer(C), ";". sgml_entity, "<" --> "<". sgml_entity, ">" --> ">". sgml_entity, "&" --> "&". 使用 DCG 使代码更具可读性。它还消除了一些多余的回溯,Cookie Monster 指出这是使用 append/3 的结果。 这是简单的解决方案,使用字符代码列表。它很可能不会为您提供最佳性能,但对于不是很长的字符串,它可能没问题。 html_unescape("", "") :- !. html_unescape(Escaped, Unescaped) :- append("&", _, Escaped), !, append(E1, E2, Escaped), sgml_entity(E1, U1), !, html_unescape(E2, U2), append(U1, U2, Unescaped). html_unescape(Escaped, Unescaped) :- append([C], E2, Escaped), html_unescape(E2, U2), append([C], U2, Unescaped). sgml_entity(Escaped, [C]) :- append(["&#", L, ";"], Escaped), catch(number_codes(C, L), error(syntax_error(_), _), fail), !. sgml_entity("<", "<"). sgml_entity(">", ">"). sgml_entity("&", "&"). 您必须自己填写 SGML 实体列表。 输出示例: ?- html_unescape("<a> 曹操", L), format('~s', [L]). <a> 曹操 L = [60, 97, 62, 32, 26361, 25805]. 如果你不介意链接外部模块,那么你可以在C中进行非常高效的实现。 html_unescape.pl: :- module(html_unescape, [ html_unescape/2 ]). :- use_foreign_library(foreign('./html_unescape.so')). html_unescape.c: #include <stdio.h> #include <string.h> #include <SWI-Prolog.h> static int to_utf8(char **unesc, unsigned ccode) { int ok = 1; if (ccode < 0x80) { *(*unesc)++ = ccode; } else if (ccode < 0x800) { *(*unesc)++ = 192 + ccode / 64; *(*unesc)++ = 128 + ccode % 64; } else if (ccode - 0xd800u < 0x800) { ok = 0; } else if (ccode < 0x10000) { *(*unesc)++ = 224 + ccode / 4096; *(*unesc)++ = 128 + ccode / 64 % 64; *(*unesc)++ = 128 + ccode % 64; } else if (ccode < 0x110000) { *(*unesc)++ = 240 + ccode / 262144; *(*unesc)++ = 128 + ccode / 4096 % 64; *(*unesc)++ = 128 + ccode / 64 % 64; *(*unesc)++ = 128 + ccode % 64; } else { ok = 0; } return ok; } static int numeric_entity(char **esc, char **unesc) { int consumed; unsigned ccode; int ok = (sscanf(*esc, "&#%u;%n", &ccode, &consumed) > 0 || sscanf(*esc, "&#x%x;%n", &ccode, &consumed) > 0) && consumed > 0 && to_utf8(unesc, ccode); if (ok) { *esc += consumed; } return ok; } static int symbolic_entity(char **esc, char **unesc, char *name, int ccode) { int ok = strncmp(*esc, name, strlen(name)) == 0 && to_utf8(unesc, ccode); if (ok) { *esc += strlen(name); } return ok; } static foreign_t pl_html_unescape(term_t escaped, term_t unescaped) { char *esc; if (!PL_get_chars(escaped, &esc, CVT_ATOM | REP_UTF8)) { PL_fail; } else if (strchr(esc, '&') == NULL) { return PL_unify(escaped, unescaped); } else { char buffer[strlen(esc) + 1]; char *unesc = buffer; while (*esc != '\0') { if (*esc != '&' || !(numeric_entity(&esc, &unesc) || symbolic_entity(&esc, &unesc, "<", '<') || symbolic_entity(&esc, &unesc, ">", '>') || symbolic_entity(&esc, &unesc, "&", '&'))) // TODO: more entities... { *unesc++ = *esc++; } } return PL_unify_chars(unescaped, PL_ATOM | REP_UTF8, unesc - buffer, buffer); } } install_t install_html_unescape() { PL_register_foreign("html_unescape", 2, pl_html_unescape, 0); } 以下语句将从 html_unescape.c 构建一个共享库 html_unescape.so。在 Ubuntu 14.04 上测试; Windows 上可能会有所不同。 swipl-ld -shared -o html_unescape html_unescape.c 启动SWI-Prolog: swipl html_unescape.pl 输出示例: ?- html_unescape('<a> 曹操', S). S = '<a> 曹操'. 特别感谢 SWI-Prolog 文档和源代码,以及 将 unicode 代码点转换为 UTF8 的 C 库? 不希望成为最终答案,因为它没有给出 SWI-Prolog 的解决方案。对于基于 Java 的解释器来说,这个问题 XML 转义不是 J2SE 的一部分,至少不是简单的 表单(不知道如何使用 Xerxes 等)。 一个可能的途径是从 StringEscapeUtils ( * ) 接口 阿帕奇共享。但话又说回来,这对于 Android既然有一个类TextUtil。所以我们推出了自己的 ( * * ) 转换很少。其工作原理如下: ?- text_escape('<abc>', X). X = '<abc>' ?- text_escape(X, '<abc>'). X = '<abc>' 注意 Java 方法 codePointAt() 和 charCount() 的使用 分别是Java源代码中的appendCodePoint()。所以它 还可以转义和取消转义基本以上的代码点 平面,即在 >0xFFFF 的范围内(当前未实现, 留作练习)。 另一方面,Apache 库(至少 2.6 版)是 不知道代理对,并将在每个代理对中放置两个小数实体 代码点改为 1。 再见 ( * ) Java:类 StringEscapeUtils 源 http://grepcode.com/file/repo1.maven.org/maven2/commons-lang/commons-lang/2.6/org/apache/commons/lang/Entities.java#Entities.escape%28java.io.Writer ,java.lang.String%29
我正在实现一个程序,需要以某种方式将事实添加到“Prolog”查询中。但我不知道该怎么做。 例如: 在我的“Prolog”数据库中,我有一条规则: 工程师(X):- 员工(X,
我希望澄清有关溯因逻辑编程与答案集编程的一些事情。 我和一些同学正在制作一个游戏。在这个游戏中有“英雄”(特殊的NPC)。
我正在寻找扩展 DCG 测试用例。方法 检查 DCG 是否正常运行的测试用例 处理器就结果的行为而言 转换后的规则,而不是其
属性变量允许扩展统一。以下是关于该界面的晦涩细节。 让我们切入正题吧! 在 sicstus-prolog 中 库(atts)为我们提供谓词...