Prolog是最常用的逻辑编程语言。它通过按时间顺序回溯和通过统一的模式匹配来支持非确定性编程。
我有这个作业,必须用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)为我们提供谓词...
所以我有这个语法: expr(op(T,B,E)) => [term(T), binop(B), expr(E)]. expr(T) => [项(T)]。 术语(N)=> [数字(N)]。 项(L)=> [左值(L)]。 术语(前(O,L))=> [incrop(O),...
如何定义用户无法查询的规则? 我只希望程序本身通过另一个规则来调用这个规则。 前任: 规则 1():- 规则 2()。 规则2():- 1<5. ?-rule1(). true ?-rule2(). ...
我用表格功能做了一些实验 b-prolog 版本 8.1,我对观察到的性能感到非常惊讶。 这是我使用的代码。它计算 Collatz 的数量...
(这是该问题的后续)。 如何写 Lead1(Xs,Ys) 这是正确的,当且仅当 Ys 是 Xs 的后缀,并且删除了所有前导 s(s(0)) 项。因此,这个问题不是删除前导 0,而是...
我正在尝试解决序言中的DCG语法并在一定程度上取得了成功,但我一直在评估涉及此类大括号的表达式。 expr( T, ['(', 5, +, 4, ')', *, 7], []), expr(Z) --> ...
我想生成整数,我正在寻找最好的方法来做到这一点。例子: ?- 数字2(N)。 N=0; N = 1; N = 2; ... (等等) 现在我只是使用 length/2: 数字2(N) :- 长度(_...
有没有支持lambda表达式的Java PROLOG实现?我知道还有其他语言的 Java 实现支持 lambda 表达式,例如 LISP 和 Clojure,但是...
我想编写一个程序,如果用户进入冬天,则将“cold”设置为“true”;如果用户进入“夏天”,则将“warm”设置为“true”。这是我到目前为止所拥有的: 开始 :- 写('现在是什么季节?: '),读...
我想使用 SICStus Prolog 查看谓词目标内的执行时间。 例子 : 预测:- 目标1, 时间, 目标2, 时间。 去 :- 调用(预测)。 时间去:- 去, 次(走)。 经验...
我有一个列表,开头有未知数量的零,例如 [0, 0, 0, 1, 2, 0, 3]。我需要将此列表去掉前导零,以便它看起来像 [1, 2, 0 , 3]。 ...
我正在寻找研究论文或任何其他出版物,以比较不同的抽象机(多个)执行 Prolog 与不基于抽象机的 Prolog 解释器。什么...