形式语言实践题
- Even --> [s],[s].
- even --> [s],[s].
- ϵ
- even --> [].
- even --> [ϵ].
- even --> [_].
- even(X,[ϵ]).
- even --> [s,s].
- even --> [];[s,s].
- even --> [[s,s]|[]].
- s(Z):- even(X), even(Y), append(X,Y,Z).
- 答案
Even非常简单:它由所有包含偶数个s的字符串组成,没有其他内容。请注意,空字符串ϵ属于偶数。编写一个生成偶数的DCG。
Even --> [s],[s].
Singleton variables: [Even]
Arguments are not sufficiently instantiated
2
Even --> Even,Even.
Arguments are not sufficiently instantiated
这样写直接报错了。原来命题的第一个字母不能大写
even --> [s],[s].
even --> even,even.
测试这两行代码似乎可以了。
even(X,[]).
X = [s, s]
X = [s, s, s, s]
X = [s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s, s, s]
ϵ
怎么把这个空字符串加上去,又来了一个空无。
even --> [s],[s].
even --> even,even.
even --> [].
添加这一行做为第三行,放最后没有执行到。
放前面呢?
even --> [].
even --> [s],[s].
even --> even,even.
放前面只交替空和两个s
X = []
X = [s, s]
X = []
X = [s, s]
X = []
X = [s, s]
X = []
这个符号可以直接用吗?把这个符号放空里面。
even --> [ϵ].
even --> [s],[s].
even --> even,even.
X = [ϵ]
X = [s, s]
X = [ϵ, ϵ]
X = [ϵ, s, s]
X = [ϵ, ϵ, ϵ]
X = [ϵ, ϵ, s, s]
X = [ϵ, ϵ, ϵ, ϵ]
出现了很多重复的空。
改成匿名符号:
even --> [_].
even --> [s],[s].
even --> even,even.
X = []
X = [s, s]
X = [, ]
X = [, s, s]
X = [_, _, ]
X = [, , s, s]
X = [, _, _, ]
X = [, _, , s, s]
X = [, _, _, _, _]
是不是问的方式不对
even(X,[ϵ]).
X = [s, s, ϵ]
X = [s, s, s, s, ϵ]
X = [s, s, s, s, s, s, ϵ]
X = [s, s, s, s, s, s, s, s, ϵ]
X = [s, s, s, s, s, s, s, s, s, s, ϵ]
每个里面都加了空这个符号。
even --> [s,s].
even --> even,even.
这样写也可以。
even --> ϵ.
even --> [s,s].
even --> even,even.
procedure `ϵ(A,B)’ does not exist
Reachable from:
even(A,B)
调试
trace, (even(X,[])).
Call:even(_4828,[])
Exit:even([s, s],[])
X = [s, s]
Redo:even(_430,[])
Call:even(_424,_664)
Exit:even([s, s|_652],_652)
Call:even(_652,[])
Exit:even([s, s],[])
Exit:even([s, s, s, s],[])
X = [s, s, s, s]
Redo:even(_650,[])
直接写个空的事实不行吗?
用逻辑并的分号
even --> [];[s,s].
even --> even,even.
写在前面不行
even --> [s,s];[].
even --> even,even.
其他每个打印了两次
even(X,[]).
X = [s, s]
X = []
X = [s, s, s, s]
X = [s, s]
X = [s, s, s, s, s, s]
X = [s, s, s, s]
X = [s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s]
X = [s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s]
Call:even(_5098,[])
Call:_432=[s, s]
Exit:[s, s]=[s, s]
Exit:even([s, s],[])
X = [s, s]
Redo:even(_432,[])
Call:_426=[]
Exit:[]=[]
Exit:even([],[])
X = []
Redo:even(_426,[])
Call:even(_426,_666)
总会Redo前面一个比如_432,_426
even --> [[s,s]|[]].
even --> even,even.
这样就要去括号了
Call:even(_4864,[])
Exit:even([[s, s]],[])
X = [[s, s]]
Redo:even(_432,[])
X = [[s, s], [s, s]]
X = [[s, s], [s, s], [s, s]]
X = [[s, s], [s, s], [s, s], [s, s]]
用前面学的递归调用呢?
s(Z):- even(X), even(Y), append(X,Y,Z).
even([]).
even([s,s]).
调试:
s(X).
X = []
X = [s, s]
X = [s, s]
X = [s, s, s, s]
就停止了这里要无限。
再加几行:
s(Z):- even(X), even(Y), append(X,Y,Z).
even([]).
even([s,s]).
even(X):-
append(even([]),even([s,s]),X).
也是没有成功。
把前面的例子改一下就可以了。
答案
s --> [].
s --> l,s,r.
l --> [a].
r --> [a].
![]() |
---|