我在这个语法中有一个左递归的小问题.我正在尝试在Prolog中编写它,但我不知道如何删除左递归.
<expression> -> <simple_expression>
<simple_expression> -> <simple_expression> <binary_operator> <simple_expression>
<simple_expression> -> <function>
<function> -> <function> <atom>
<function> -> <atom>
<atom> -> <number> | <variable>
<binary_operator> -> + | - | * | /
expression(Expr) --> simple_expression(SExpr), { Expr = SExpr }.
simple_expression(SExpr) --> simple_expression(SExpr1), binary_operator(Op), simple_expression(SExpr2), { SExpr =.. [Op, SExpr1, SExpr2] }.
simple_expression(SExpr) --> function(Func), { SExpr = Func }.
function(Func) --> function(Func2), atom(At), { Func = [Func2, atom(At)] }.
function(Func) --> atom(At), { Func = At }.
Run Code Online (Sandbox Code Playgroud)
我写过类似的东西,但它根本不起作用.如何更改它以使该程序正常工作?
:我不能这个页面CLP(FD)的上找到除法(/)符号http://www.swi-prolog.org/man/clpfd.html
同样,这个简单的代码也会给出错误:
:-use_module(library(clpfd)).
afn(A,B,C):-
C #= B / A.
?- afn(23, 56, C).
ERROR: Domain error: `clpfd_expression' expected, found `56/23'
Run Code Online (Sandbox Code Playgroud)
问题在哪里,如何解决?谢谢。
我正在尝试定义一个带有自由变量的单个术语的谓词,并返回这些变量的映射列表,例如,如果数据库是
a(0,1).
a(1,1).
Run Code Online (Sandbox Code Playgroud)
预期的产出是
?- eval(a(X,1),Maps).
Maps = [[[X,0]],[[X,1]]].
?- eval(a(X,Y),Maps).
Maps = [[[X,0],[Y,1]],[[X,1],[Y,1]]].
Run Code Online (Sandbox Code Playgroud)
我一直试图通过使用来实现这一目标findall/3,但我无法找到一种方法来询问自由变量及其可能的值.如果它有帮助,我正在使用swiprolog.谢谢.
是否可以注册一些协议,然后通过URL启动IntelliJ.我正在考虑从JVM中通过Desktop.browse()提交URL.
我的想法是URL将包含文件名参数和行号参数.然后IntelliJ将打开此文件名并滚动到给定的行号.这是一个例子:
intellij:/mypath/myfile#99
Run Code Online (Sandbox Code Playgroud)
这已经完成了吗?
再见
PS:java.awt.Desktop类
http://docs.oracle.com/javase/6/docs/api/java/awt/Desktop.html
假设我有以下DCG规则:
factor(X) --> "(", expr(X), ")".
Run Code Online (Sandbox Code Playgroud)
通常这将被翻译为:
factor(X, A, B) :-
[40|C] = A, expr(X, C, D), [41|B] = D.
Run Code Online (Sandbox Code Playgroud)
是否允许Prolog系统将其翻译如下,
即将统一合并到头部和目标中?
factor(X, [40|A], B) :-
expr(X, A, [41|B]).
Run Code Online (Sandbox Code Playgroud)
如果DCG扩展不会坚定,则不允许
将[41 | B]放在expr调用的第三个参数中.
但我想坚定不移,所以一切都应该没问题?
再见
PS:关于坚定性的非正式定义,请参阅:
Richard O'Keefe,2009:
"作为Prolog编程中"坚定"一词的发明者,
我应该赞成它.坚定性基本上
意味着你不能强迫谓词错误
填写输出参数错误的路径."
http://blog.gmane.org/gmane.comp.ai.prolog.swi/month=20090301
PSS:对于其他DCG翻译,请参阅最新的
DCG标准提案.附录包含DCG翻译器
源代码:
ISO/IEC DTR 13211-3:2006
明确条款语法规则
Klaus Daessler
2012年11月20日
N238 DIN草案2012-11-20
我有一个手动制作的DCG规则来选择单个单词的惯用语.DCG规则如下:
seq(cons(X,Y), I, O) :- noun(X, I, H), seq(Y, H, O), \+ noun(_, I, O).
seq(X) --> noun(X).
Run Code Online (Sandbox Code Playgroud)
第一个子句是手动制作的,因为它(:-)/2是用来代替的(-->)/2.我可以用一些使用标准DCG的子句替换这个手工制作的子句吗?
最好的祝福
PS:这是一些测试数据:
noun(n1) --> ['trojan'].
noun(n2) --> ['horse'].
noun(n3) --> ['trojan', 'horse'].
noun(n4) --> ['war'].
Run Code Online (Sandbox Code Playgroud)
以下是一些测试用例,重要的测试用例是第一个测试用例,因为它只提供n3而不是cons(n1,n2).第一个测试用例的行为是特别需要的:
?- phrase(seq(X),['trojan','horse']).
X = n3 ;
No
?- phrase(seq(X),['war','horse']).
X = cons(n4,n2) ;
No
?- phrase(seq(X),['trojan','war']).
X = cons(n1,n4) ;
No
Run Code Online (Sandbox Code Playgroud) 我正在为Fox和Geese类型的游戏编写AI.我的一个谓词看起来像这样:
moveFox(+PrevState, -NextState, -PegList, +VisitedStates, -NewVisitedStates)
Run Code Online (Sandbox Code Playgroud)
它需要一个游戏状态并与狐狸一起移动.结果状态统一,NextState实际移动统一PegList.一切都按预期工作.
我正在计算所有动作的效用得分NextState.为了能够找到效用得分最高的州,我findall/3会在比较其效用得分之前使用列表中的所有州.
findall(NextState, moveFox(...), NextStatesList)
Run Code Online (Sandbox Code Playgroud)
通过找到最大效用分数,我知道具有最高效用分数的NextState(以及其在列表中的位置).只有一个问题,目前我还没有写任何谓词来推断出要采取的行动NextState,例如:
getMove(+PrevState, +NextState, -PegList)
Run Code Online (Sandbox Code Playgroud)
而不是写这样的谓词,我宁愿使用findall/3或等效.我的问题是,是否有某种方法可以在两个不同的列表中获得两个不同的变量.我这样想(如果它会起作用):
findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList])
Run Code Online (Sandbox Code Playgroud)
我可以实现这样的功能,而不必运行findall/3两次(丑陋的开销)或编写该getMove(+PrevState, +NextState, -PegList)谓词?
我正在寻找一种OCR软件,可以将叠加HTML呈现给图像.我目前正在使用一些未命名的产品.它具有OCR功能,可以对带有图像的PDF文档进行内联OCR.
内联OCR非常方便,它允许使用图像搜索PDF文档.文本也可以直接在文档中突出显示,OCR文本与底层图像对齐.不幸的是,我可以从未命名的产品中导出或存储内联OCR.
是否有其他软件可以执行和导出内联OCR?我特别感兴趣的是导出到一个由定位的段落组成的HTML,这些段落与底层图像对齐.
另见:https:
//stackoverflow.com/questions/11404805/ocr-and-the-location-of-the-image-where-the-scanned-document-came-from
想象一下,我们有familytree下面的模块(简单示例):
:- module(familytree, [
father/2,
mother/2,
%[...]
]).
father(X,Y) :- male(X),parent(X,Y).
father(unknown, _) :- male(unknown).
mother(X,Y) :- female(X),parent(X,Y).
mother(unknown, _) :- female(unknown).
sister(X,Y) :- female(X),parent(Z,X),parent(Z,Y), X \= Y.
%[... other relation predicates ... ]
Run Code Online (Sandbox Code Playgroud)
我想使用不同"dbs"的这个模块谓词,例如:
:- module(familytree_xyz, []).
male(james).
male(fred).
male(mike).
female(betty).
female(sandra).
parent(james, fred).
parent(betty, fred).
Run Code Online (Sandbox Code Playgroud)
要么 :
:- module(familytree_simpson, []).
male(homer).
male(bart).
female(marge).
female(lisa).
parent(homer, bart).
%[...]
Run Code Online (Sandbox Code Playgroud)
我需要 :
现在,我试着玩term_expansion/2, …
我想知道如何将Prolog中的统一和OO结合起来.我想在术语对象上实现多方法调度.
如果没有术语对象和简单术语,我会执行以下操作,并且可以从多参数索引中获益:
collide_with(asteroid(_), asteroid(_)) :- /* case 1 */
collide_with(asteroid(_), spaceship(_,_)) :- /* case 2 */
collide_with(spaceship(_,_), asteroid(_)) :- /* case 3 */
collide_with(spaceship(_,_), spaceship(_,_)) :- /* case 4 */
Run Code Online (Sandbox Code Playgroud)
但上面只给出了一个确切的类型匹配.
如果我想要一个子类类型匹配,我该怎么办(可能有更多的太空船子类,如excelsior,galaxy等......在情况2,3和4中也应该匹配).
我还可以使用统一和索引吗?
再见
PS:这个例子来自这里没有Prolog解决方案:https:
//en.wikipedia.org/wiki/Multiple_dispatch