假设我有以下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解析3 GB的大文件时,效率至关重要。
我的词法分析器的当前版本主要使用or或谓词; / 2,但我读到索引可以提供帮助。
索引是一种用于为特定目标快速选择谓词的候选子句的技术。在大多数Prolog系统中,(仅)对头部的第一个参数进行索引。如果将此参数用函子实例化为原子,整数,浮点或复合项,则使用散列法快速选择第一个参数可以与目标的第一个参数统一的所有子句。SWI-Prolog支持即时和多参数索引。参见2.18节。
有人可以举一个使用索引进行词法化的例子,并可能解释一下它如何提高效率吗?
细节
注意:在将源代码处理到此问题之前,我更改了一些名称。如果您发现错误,请随时在此处进行编辑或给我留言,我们将很乐意解决。
当前我的词法分析器/令牌生成器(基于mzapotoczny / prolog-interpreter parser.pl)是这个
% N.B.
% Since the lexer uses "" for values, the double_quotes flag has to be set to `chars`.
% If double_quotes flag is set to `code`, the the values with "" will not be matched.
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- set_prolog_flag(double_quotes,chars).
lexer(Tokens) -->
white_space,
(
( ":", !, { Token = tokColon }
; "(", !, { Token …Run Code Online (Sandbox Code Playgroud) 我正在定义一个函数alter_func(Ps,P),其中Ps是列表的列表,P是Ps中所有元素的列表,其行为如下:
?- alternate_func([[p,q],[r,s]],P).
P=[p,r,q,s]. (case 1)
?- alternate_func([P,Q,R],[p,q,r,s,t,u]).
P=[p,s], Q=[q,t], R=[r,u]. (case 2)
?- alternate_func([Q],[1,2,3]).
Q=[1,2,3]. (case 3)
?- alternate_func([[4,5,6],[3,1],[4,1,2]],X).
false. (because Length of sublists must be same) (case 4)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我尝试过的
alternate_func([[], L], L).
alternate_func([[H|T], []], [H|T]).
alternate_func([[X|L1], [Y|L2]], [X,Y|L3]) :-
alternate_func([L1, L2], L3).
Run Code Online (Sandbox Code Playgroud)
对于情况1,我得到了正确的结果,但是对于2,3和4,我却失败了。这是什么问题?
我有一个方法长度(列表,var),它给了我一个列表的长度,但我想找到一个字符串的长度,任何人有一个解决方案?
我试图使用这里的文档中所谓的内置谓词split_string/4:http://www.swi-prolog.org/pldoc/man?predicate = split_string/4
但是,当我尝试使用它时,如示例中所示,我得到这样的结果:
?- split_string("a.b.c.d", ".", "", L).
ERROR: toplevel: Undefined procedure: split_string/4 (DWIM could not correct goal)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我应该先加载一些库吗?
我正在尝试将字符数组转换为字符串,然后将该字符串转换为列表。这就是我要的:
code_list=[97 97]
string_s="aa"
string_list=[aa]
Run Code Online (Sandbox Code Playgroud)
我不确定符号,我是否正确使用了它们。
我对 Prolog 很陌生,我偶然发现了一些我不明白的东西。
这是我的代码:
:- dynamic user/3.
user('id', 'Name', 20).
changeAge(Id, NewAge) :-
user(Id, Name, _),
retract(user(Id,_,_)),
assert(user(Id,Name,NewAge)).
Run Code Online (Sandbox Code Playgroud)
要更新数据库中的用户信息,
changeAge/2请执行以下三个步骤:
user/3。retract/1。assert/1。这是我的控制台输出:
1 ?- user('id', _, Age).
Age = 20.
2 ?- changeAge('id', 25).
true.
3 ?- user('id', _, Age).
Age = 25.
4 ?- changeAge("id", 30).
false.
5 ?- user('id', _, Age).
Age = 25.
Run Code Online (Sandbox Code Playgroud)
为什么单引号给我true(第 2 行),而双引号给我false(第 4 行)?
这是CFG:
S -> T | V
T -> UU
U -> aUb | ab
V -> aVb | aWb
W -> bWa | ba
Run Code Online (Sandbox Code Playgroud)
所以这将接受某种形式的:
{a^n b^n a^m b^m | n,m >= 1} U {a^n b^m a^m b^n | n,m >= 1}
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码:
in_lang([]).
in_lang(L) :-
mapS(L), !.
mapS(L) :-
mapT(L) ; mapV(L),!.
mapT(L) :-
append(L1, mapU(L), L), mapU(L1), !.
mapU([a|T]) :-
((append(L1,[b],T), mapU(L1)) ; (T = b)),!.
mapV([a|T]) :-
((append(L1,[b],T), mapV(L1)) ;
(append(L1,[b],T), mapW(L1))),
!.
mapW([b|T]) :-
((append(L1,[a],T), mapW(L1)) …Run Code Online (Sandbox Code Playgroud) 我正在 Prolog 中进行练习,但被卡住了。我需要将列表中的三个相邻项目与另外三个元素交换。
那是:
| ?- swap([c,g,g,a,t,t,g,c,a,a], X).
X = [a,t,t,c,g,g,g,c,a,a]
X = [g,c,a,a,t,t,c,g,g,a]
X = [c,g,g,g,c,a,a,t,t,a]
X = [c,a,a,a,t,t,g,c,g,g]
.
.
.
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
swap([H1, H2, H3, H4, H5, H6|T1], X) :-
X = [H4, H5, H6, H1, H2, H3|T1];
swap([H2, H3, H4, H5, H6|T1], X);
swap([H1, H2, H3, H4, H5|T1], X).
Run Code Online (Sandbox Code Playgroud)
这个输出是:
| ?- swap([c,g,g,a,t,t,g,c,a,a], X).
X = [a, t, t, c, g, g, g, c, a, a] ;
X = [t, t, g, g, g, a, c, a, …Run Code Online (Sandbox Code Playgroud) 从html来看,marquee显然是语义网的顶峰。或者更确切地说,它的最低点与闪烁标签并排。无论如何,我们如何在 Prolog 中表示选取框?换句话说,如何定义一个关系marquee/2以使以下内容成立:
?- marquee("Prolog is marquee ready! ",M).
M = "Prolog is marquee ready! "
; M = "rolog is marquee ready! P"
; M = "olog is marquee ready! Pr"
; M = "log is marquee ready! Pro"
; M = "og is marquee ready! Prol"
; M = "g is marquee ready! Prolo"
; M = " is marquee ready! Prolog"
; M = "is marquee ready! Prolog "
; M = …Run Code Online (Sandbox Code Playgroud) 鉴于CFG
S --> a S b | c | d
Run Code Online (Sandbox Code Playgroud)
我想写一个谓词,如语法('S',句子),它可以产生所有可能的
sentences like
sentence=acb,
sentence=acd,
sentence=c,
sentence=ab......................
Run Code Online (Sandbox Code Playgroud)
使用最左边的推导,如果遇到的符号是终端,它应该打印出该终端,如果遇到的符号是非终端 'S',它应该回溯并替换其中一个语法a S b或c或d并重复处理.
我不想要任何代码......只是帮我提一些如何开始的提示
我目前陷入了序言问题。
到目前为止我有:
film(Title) :- movie(Title,_,_). (其中“ movie(T,_,_,)”是对我的数据库的引用)
namesearch(Title, Firstword) :- film(Title), contains_term(Firstword, Title).
Run Code Online (Sandbox Code Playgroud)
很难解释我需要什么帮助,但基本上有一个通配符我可以用来搜索以特定单词开头的所有电影,例如,如果我要搜索以单词“The”开头的所有电影。
是否有一个通配符可以让我这样输入:namesearch(X,'The*')?
我尝试过像这样使用星号,但它不起作用,
感谢您的帮助
例如:["c","h","a","r"]应该打印"char".
它的atomic_list_concat(),但是我该怎么做呢:
longest_common_prefix([H1,H2|T], P) :-
maplist(append(P), L, [H1,H2|T]).
Run Code Online (Sandbox Code Playgroud) prolog ×13
dcg ×4
iso-prolog ×2
swi-prolog ×2
list ×1
marquee ×1
performance ×1
portability ×1
prolog-dif ×1
recursion ×1
swap ×1
tokenize ×1