Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Prolog中为位字符串定义DCG_Prolog_Dcg - Fatal编程技术网

在Prolog中为位字符串定义DCG

在Prolog中为位字符串定义DCG,prolog,dcg,Prolog,Dcg,在下周的Prolog考试之前,我们的讲师给我们提供了一些练习题,但下面的问题让我很为难。有人能帮忙吗 对于每个n>0的整数 设Ln:={s∈ {0,1}+| s以1(0+1)n的字符串结尾−1} 是最后一位的第n位为1的位字符串集。就是 由正则表达式描述 (0+1)∗1(0+1)n−一, 为三元谓词s/3定义一个DCG,使s(n,s,[])为真 确切地说,如果s在Ln中编码字符串 %--- %结果我们需要这些 % --- %“any(N,gen)”生成/接受任何长度为N的位字符串 %条款的顺序不

在下周的Prolog考试之前,我们的讲师给我们提供了一些练习题,但下面的问题让我很为难。有人能帮忙吗

对于每个n>0的整数

设Ln:={s∈ {0,1}+| s以1(0+1)n的字符串结尾−1}

是最后一位的第n位为1的位字符串集。就是 由正则表达式描述

(0+1)∗1(0+1)n−一,

为三元谓词s/3定义一个DCG,使s(n,s,[])为真 确切地说,如果s在Ln中编码字符串

%---
%结果我们需要这些
% ---
%“any(N,gen)”生成/接受任何长度为N的位字符串
%条款的顺序不重要!
any(N,gen)->{N>0},(`0`;`1`),{Nm是N-1},any(Nm,gen)。
任何(0,gen)->[]。
%“any(N,genfree)”生成/接受任意长度N的任何位字符串
%[]的子句必须是第一个,并且必须出现01任意选择
%在递归之后。
任意(0,genfree)--->[]。
any(N,genfree)->any(Nm,genfree),(`0`;`1`),{N是Nm+1}。
% ---
%在各种模式下运行DCG语法
% ---
%生成时,使用“x”而不是“1”使特殊的“1”可见
%当使用未声明的N生成时,我们需要确保“达到无穷大”
%以公平的方式。对于总长度和
%把这个长度除以“any”后缀和“any”前缀听起来很公平!
my_language(N,gen)-->任意(u,genfree),`1`,任意(N,gen)。
my_language(N,genfree)-->{between(0,inf,L),between(0,L,N),前缀是L-N},any(Prefix,gen),`1`,any(N,gen)。
%假装比特串的总长度未知是不切实际的。
%首先是效率低下,然后是难以避免更长时间的猜测
%以及比字符串总长度和sink长度更长的前缀
%进入回溯柏油坑。使用整个位字符串要好得多
%长度!
我的语言(N,accept,L)->{M是L-N-1},任意(M,gen),`1`,任意(N,gen)。
我的语言(N,acceptfree,L)->{Lm是L-1,介于(0,Lm,N)之间,M是L-N-1},任意(M,gen),`1`,任意(N,gen)。
% ===
%印刷品
% ===
解释(文本,位,N):-
原子字符(位、字符),
长度(后缀,N),
追加([前缀,[X],后缀],字符),
格式(“~s[~s][~s][~s]~n”,[Text,Prefix,[X],后缀])。
% ===
%叫这些。在所有情况下,余数必须是空字符串,因为
%我们使用短语/2,它与带有emtpy余数的短语/3相同
% ===
%接受位,N未声明,使用位的总长度
lang(位,N):-
var(N),非var(位),
!,
原子_码(位、码),
长度(代码,L),
格式(“接受长度~q的~q,后缀长度未声明~n”,[Bits,L]),
短语(my_语言(N,acceptfree,L),代码),
解释(“找到”,位,N)。
%接受位,声明N,并使用位的总长度
lang(位,N):-
非AR(N),非AR(位),
!,
原子_码(位、码),
长度(代码,L),
格式(“接受长度为~q的~q,需要长度为~q~n的后缀,[Bits,L,n]),
短语(我的语言(N,accept,L),代码),
解释(“找到”,位,N)。
%生成N个未声明的位(因此可由Prolog提出)
lang(位,N):-
var(N),var(位),
!,
格式(“生成短语,未声明任何内容~n”,[]),
短语(my_语言(N,genfree),代码),
原子_码(位、码),
解释(“生成”,位,N)。
%生成位,并声明N
lang(位,N):-
整数(N),变量(位),
!,
格式(“生成短语,需要长度为~q~n的后缀,[n]),
短语(我的语言(N,gen),代码),
原子_码(位、码),
解释(“生成”,位,N)。
因此:

我们可以接受位字符串

…查找后缀长度:

?-lang('0101000100100001',u001)。
接受长度为16的“01010000100100001”,后缀长度未注明
找到[010100010000][1][]
是的;
找到[0101000000][1][00001]
是的;
找到[0101000][1][00100001]
是的;
找到[010][1][0001001000001]
是的;
找到[0][1][01000100001]
是的;
错。
…说明后缀长度:

?-lang('01010000100001',2)。
接受长度为16的“01010000100100001”,需要长度为2的后缀
错。
?-lang('01010000100001',5)。
接受长度为16的“01010000100100001”,需要长度为5的后缀
找到[0101000000][1][00001]
是的;
错。
我们可以生成(越来越长的)位字符串

…说明后缀长度:

?-lang(X,2)。
生成短语,需要长度为2的后缀
已生成[][1][00]
X='100';
生成[][1][01]
X='101';
生成[][1][10]
X='110';
生成[][1][11]
X='111';
已生成[0][1][00]
X='0100';
已生成[0][1][01]
X='0101';
已生成[0][1][10]
X='0110';
已生成[0][1][11]
X='0111';
已生成[1][1][00]
X='1100';
已生成[1][1][01]
X='1101';
已生成[1][1][10]
X='1110';
已生成[1][1][11]
X='1111';
已生成[00][1][00]
X='00100'
...
…保留后缀长度自由,让Prolog提出一个:

?-lang(X,N)。
生成短语,没有任何声明
生成[][1][]
X='1',
N=0;
已生成[0][1][]
X='01',
N=0;
生成[1][1][]
X='11',
N=0;
已生成[][1][0]
X='10',
N=1;
生成[][1][1]
X='11',
N=1;
生成[00][1][]
X='001',
N=0;
生成[01][1][]
X='011',
N=0;
生成[10][1][]
X='101',
N=0;
生成[11][1][]
X='111',
N=0

您能否编写一个描述与正则表达式相同语言的DCG
(0+1)
?你能为
(0+1)*
写一个吗?告诉我们你试过什么,你能做什么,你需要帮助什么。@IsabelleNewbie很长时间后,我有了一个解决方案。。。post Y/N?一个人需要什么样的搜索基础设施才能只声明语法和系统生成并接受,而不需要额外的代码,也不需要通过任意的无限途径进行搜索?负责?这样的事情怎么了<代码>语言(N)-->any01[1],{N1}=N-1},{N1}>=0},n01(N1)。a01-->[0]|[1]。any01-->[]| a01,any01。n01(0)