Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第三节, 练习题和答案

练习题 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。

你可能感兴趣的:(Prolog)