逻辑形式语言

形式语言实践题

  • 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].

形式语言形式语言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值