2017-07-25 23 views
2

我是Prolog的新手,并逐渐通过Ivan Bratko的“Prolog Programming for Artificial Intelligence”(第4版)。序言:语法正确的对象+关系与结构

做练习时2.1。 (第39页),我不明白为什么5(X,Y)在语法上不正确,而+(north,west)是正确的。起初我认为它与函子是一个数字(因为我认为这可能只是一个原子)有关,但根据这本书,一个原子也可以是一个数字。然后我认为这是一个与变量有关的问题,但我不明白为什么这会对语法正确性造成问题。任何人都可以用正确的方向指出我的解释吗?

此外,我想知道关系和结构之间的确切区别是什么。虽然date(1, may, 2001)(第35页)被视为一种结构,但我想知道我们是否可以对第1章早期的例子说同样的话。例如,第一章中的关系parent(pam,bob)也是所谓的结构,还是上午我混淆的东西?

在此先感谢。

+1

'原子(5)'失败。所以从技术上讲,一个数字不是一个原子。我没有那本书,所以知道他们声称的原因是一个原子也可以是数字*。 – lurker

+1

这也许会有所帮助:[Prolog。结构(复杂的术语)与谓词,我真的没有区别](https://stackoverflow.com/questions/28972038/prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference/ 28972664#28972664) – lurker

+0

谢谢!我不知道这样的谓词。 – milanv

回答

3

我不明白为什么5(X,Y)在句法上不正确,而+(北,西)是正确的。

一个数字不是一个原子,而是一个数字。

在第33个第2.1.1节原子和数字记载:

Atoms can be constructed in three ways: 
1. Strings of letters, digits and the underscore character, 
    starting with a lower-case letter. 
2. Strings of special characters such as + - */< > = : . & _ ~ 
3. Strings of characters enclosed in single quotes. 

字符5

  • 失败规则1,因为字符串不以下划线 字符或更低启动 - 字母
  • 由于不是规则2而不是一个 的特殊字符
  • 因为它不是在单引号

字符+成功,因为规则2是一个特殊字符封闭 失败规则3。进一步探讨这种

一种方式是通过使用SWI-Prolog的functor/3

?- functor(+(north,west),Name,Arity). 
Name = (+), 
Arity = 2. 

?- functor(5(X,Y). 
ERROR: Syntax error: Operator expected 
ERROR: functor(
ERROR: ** here ** 
ERROR: 5(X,Y) . 

准确的区别是什么关系和结构之间

在第4页第1.1节定义关系通过事实

通常,关系被定义为其所有实例的集合。例如,亲本(汤姆,鲍勃)亲本关系的特定实例。其他情况如下:

parent(pam,bob) 
parent(tom,liz) 
parent(bob,ann) 
parent(bob,pat) 
parent(pat,jim) 

第35页第2.1节。3层结构

结构化对象(或简称结构)是具有几个组件对象,例如你的问题

date(1, may, 2001) 
point(1,1) 
seg(P1,P2) 
seg(point(1,1),point(2,3)) 
(a + b) * (c - 5)   % uses infix operator 
*(+(a,b),-(c,5))   % uses prefix operator 

寻找让我觉得你正在寻找双方的关系和结构,可用于区分一个与其他公共财产。我不知道一个;当我考虑使用Prolog时,我并不认为should I use a relation or a structure,我认为how is the data structured它可以像一个数字一样简单,或者可以是一个更复杂的结构或结构的结构,然后给出数据。在给出最好的定义时,我可以说的是,一个特定的关系可以由许多具有相同函数的结构组成,但这不是一个在我的脑海里经过这段时间的想法。

+1

它有点模糊。例如,如果我有两个事实,即'喜欢(约翰,玛丽)。和'喜欢(约翰,苏)','/ 2 /'确实形成了一个关系,即使没有规则。另外,为了增加更多的模糊性,add(X,Y,Z): - Z是X + Y.'相当于':-(add(X,Y,Z),(Z是X + Y))'这可以被认为是*结构*。也许一个*结构*是任何一个关联数据含义(它使它成为*关系*?)的复合项。 – lurker

+1

是的,我没有试图否定你的答案,只是增加了讨论。 – lurker

+0

@ lurker不用担心。如果我知道大部分答案,我知道评论会指出我缺乏知识的地方,然后我学到了一些东西。请继续评论,因为它可以帮助我学习。正如我有这本书的确切版本,我会更深入地研究这一点。 –