练习题 1.1 下面的字符序列哪些是原子,哪些是变量,哪些两者都不是?
1. vINCENT
2. Footmassage
3. variable23
4. Variable2000
5. big_kahuna_burger
6. ‘big kahuna burger‘
7. big kahuna burger
8. ‘Jules‘
9. _Jules
10. ‘_Jules‘
我的答案:
vINCENT,variable23,big_kahuna_burger,‘big kahuna burger‘,‘Jules‘,‘_Jules‘是原子;
Footmassage,Variable2000是变量;
big kahuna burger两者都不是
练习题 1.2 下面的字符序列中哪些是原子,哪些是变量,哪些是复杂语句,哪些什么都不是?给出每个复杂语句的函子和元数。
1. loves(Vincent, mia)
2. ‘loves(Vincent, mia)‘
3. Butch(boxer)
4. boxer(Butch)
5. and(big(burger), kahuna(burger))
6. and(big(X), kahuna(X))
7. _and(big(X), kahuna(X))
8. (Butch kills Vincent)
9. kills(Butch Vincent)
10. kills(Butch, Vincent
我的答案:
‘loves(Vincent, mia)‘是原子;
没有变量;
复杂语句有:
loves(Vincent, mia),函子是loves,元数是2;
boxer(Butch),函子是boxer,元数是1;
and(big(burger), kahuna(burger)),函子是and,元数是2;
and(big(X), kahuna(X)),函子是and,元数是2;
什么都不是的包括:Butch(boxer),_and(big(X), kahuna(X)),(Butch kills Vincent),kills(Butch Vincent),kills(Butch, Vincent。
练习题 1.3 在下面的知识库中,事实,规则,子句和谓词分别有多少个?哪些是规则的头部,哪些是对应的目标?
woman(vincent).
woman(mia).
man(jules).
person(X) :- man(X); woman(X).
loves(X, Y) :- father(X, Y).
father(Y, Z) :- man(Y), son(Z, Y).
father(Y, Z) :- man(Y), daughter(Z, Y).
我的答案:
事实一共有3个,它们是:
woman(vincent).
woman(mia).
man(jules).
规则一共有4个,它们是:
person(X) :- man(X); woman(X).
loves(X, Y) :- father(X, Y).
father(Y, Z) :- man(Y), son(Z, Y).
father(Y, Z) :- man(Y), daughter(Z, Y).
子句一共有7个,它们是:
man(X),woman(X),father(X, Y),man(Y),son(Z, Y),man(Y),daughter(Z, Y)
谓词一共有7个,他们是:
woman,man,person,loves,father,son,daughter;
规则的头部和其包含的目标如下:
头部 | 包含的目标 |
person(X) | man(X); Woman(X) |
loves(X, Y) | father(X, Y) |
father(Y, Z) | man(Y), son(Z, Y) |
father(Y, Z) | man(Y), daughter(Z, Y) |
练习题 1.4 在Prolog中表达以下的逻辑
1. Butch is a killer
2. Mia and Marsellus are married
3. Zed is dead.
4. Marsellus kills everyone who gives Mia a footmassage.
5. Mia loves everyone who is a good dancer.
6. Jules eats anything that is nutritious or tasty.
我的答案:
1. killer(butch).
2. married(mia, marsellus).
3. dead(zed).
4. kills(marsellus, X) :- footmassage(X, mia).
5. loves(mia, X) :- good_dancer(X).
6. eats(jules, X) :- nutritious(X); tasty(X).
两点个人总结:
1. 如果要将现实中的逻辑或者信息使用Prolog的形式表达,那么函子可能会是动词、名字和形容词,而参数应该是名词或者复杂语句。
2. 函子和谓词内在的含义是一致的,这个和传统意义上的函数或者方法是有本质区别的:函数和方式有执行过程,有输入和输出;函子和谓词只是知识库中信息的存储方式,通过查询起作用。
练习题 1.5 假设我们有如下的知识库:
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).
wizard(X) :- hasBroom(X), hasWand(X).
hasBroom(X) :- quidditchPlayer(X).
Prolog会针对下面的查询做出怎么样的回答?
1. wizard(ron).
2. witch(ron).
3. wizard(hermione).
4. witch(hermione).
5. wizard(harry).
6. wizard(Y).
7. witch(Y).
我的答案:
1. Prolog会回答true,因为这是知识库中直接定义的事实。
2. Prolog会报错,因为知识库中没有定义关于witch的任何事实和规则。
3. Prolog会回答false,因为没有直接定义该事实,也不能通过间接推导得出。
4. Prolog会报错,原因同2。
5. Prolog会回答true,因为该事实可以通过间接推导得出。
6. Prolog会回答:Y = ron; Y = harry。
7. Prolog会报错,原则同2。