逻辑的空无
空
- [] = _. true
- []=[_]. false
- [[]] = [[]|[]]. true
- |
- member
- member([],[]). false
- _
- member([],_). true
- member(_,[]). false
- combine3([], [], _).
- combine3([], [], [laozi]).
[] = _. true
从用途讲。没有东西,空无可以用空表表示。但空表不是无。
[]=[_]. false
从属性讲。空表是没有东西的表,不是原子、变量、事实、规则。它里面是空无的。
[[]] = [[]|[]]. true
从使用讲。老子说无生万物,那万物都递归回到无才能做对题目。
|
把表分成头和尾。原话是:Prolog has a special built-in operator | which can be used to decompose a list into its head and tail。" |"它的操作范围一定在表里,它的后面是表的项,项多于两个要加[]。 member(X,[1,2|3,4])。这样写是会报错的,要写成 member(X,[1,2|[3,4]])。
member
题不讲了,都能找到答案。看看官网的member:
member(X,[X|T]).
member(X,[H|T]) :- member(X,T).
题目答案第一行都是combine1([],[],[])、combine2([],[],[])、combine3([],[],[]),递归到最后无生万物。为什么member没有这样写?
member([],[]). false
列表自己不能是自己的成员。调试直接一步就失败了。
Call:member([],[])
Fail:member([],[])
调试trace, (member([a],[b])).
Call:member([a],[b])
Call:member([a],[])
Fail:member([a],[])
Fail:member([a],[b])
_
后面给另外一种写法的时间讲到了这个符号,说是匿名参数,意思用它替换没用的参数T和H。These unnecessary variable names are distracting: it’s better to write predicates in a way that focuses attention on what is really important in each clause, and the anonymous variable gives us a nice way of doing this. That is, we can rewrite member/2 as follows:
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
它是空无的意思吗?文章的开头它是等于空表的,但是
member([],_). true
看来它没有那么简单。它是个新的东西,可以是空表、事实,规则,变量,数组。
member(_,[]). false
这似乎自圆其说了,空表里没有东西。如果把答案第一行里最后一个[]改成_
combine3([], [], _).
Call:combine3([f, b, yip, yup],[glu, gla, gli, glo],_7698)
Call:combine3([b, yip, yup],[gla, gli, glo],_1566)
Call:combine3([yip, yup],[gli, glo],_1584)
Call:combine3([yup],[glo],_1602)
Call:combine3([],[],_1602)
Exit:combine3([],[],_1596)
Exit:combine3([yup],[glo],[join(yup,glo)|_1596])
Exit:combine3([yip, yup],[gli, glo],[join(yip,gli), join(yup,glo)|_1596])
Exit:combine3([b, yip, yup],[gla, gli, glo],[join(b,gla), join(yip,gli), join(yup,glo)|_1596])
Exit:combine3([f, b, yip, yup],[glu, gla, gli, glo],[join(f,glu), join(b,gla), join(yip,gli), join(yup,glo)|_1596])
调试中它是临时变量_1569,R=[join(f,glu), join(b,gla), join(yip,gli), join(yup,glo)|],从结果看只是增加了"|"两个字符,意思也大体是一样的。 [join(yup,glo)|_]= [join(yup,glo)]这个的答案也是真。
combine3([], [], [laozi]).
扩展,这样改会回答什么呢?
鹿邑老子学院内老子雕像 |
---|