Syntax 序言:语法正确的对象+;关系与结构

Syntax 序言:语法正确的对象+;关系与结构,syntax,prolog,Syntax,Prolog,我不熟悉Prolog,并逐渐通过Ivan Bratko的《人工智能的Prolog编程》(第四版)学习 在做练习2.1时。(第39页),我不明白为什么5(X,Y)在语法上是不正确的,而+(北,西)是正确的。起初我认为这与函子是一个数字这一事实有关(因为我认为这只能是一个原子),但根据书中的说法,原子也可以是一个数字。然后我认为这是一个问题,因为参数是变量,但我不明白为什么这会给语法正确性带来问题。有人能给我指出正确的解释方向吗 此外,我想知道关系和结构之间的确切区别是什么。虽然日期(2001年5月

我不熟悉Prolog,并逐渐通过Ivan Bratko的《人工智能的Prolog编程》(第四版)学习

在做练习2.1时。(第39页),我不明白为什么
5(X,Y)
在语法上是不正确的,而
+(北,西)
是正确的。起初我认为这与函子是一个数字这一事实有关(因为我认为这只能是一个原子),但根据书中的说法,原子也可以是一个数字。然后我认为这是一个问题,因为参数是变量,但我不明白为什么这会给语法正确性带来问题。有人能给我指出正确的解释方向吗

此外,我想知道关系和结构之间的确切区别是什么。虽然
日期(2001年5月1日)
(第35页)被视为一种结构,但我想知道我们是否可以对第一章中的早期示例说同样的话。例如,第一章中的关系
parent(pam,bob)
也是一种所谓的结构,还是我把事情弄糊涂了

提前谢谢

我不明白为什么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.
关系和结构之间的确切区别是什么

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

通常,关系定义为其所有实例的集合。例如,parent(tom,bob)parent关系的一个特定实例。其他情况包括:

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时,我不认为我应该使用关系或结构,我想的是数据的结构是怎样的,它可以简单到一个数字,也可以复杂到一个结构或一个结构的结构,然后,给定数据,达到目标所需的谓词(规则)是什么。从给出的定义来看,我能说的最好的一点是,一个特定的关系可以由许多具有相同函子的结构组成,但这不是一个能在我脑海中持续到这一时期的想法。

atom(5)
失败了。所以从技术上讲,数字不是原子。我没有那本书,所以了解他们声称原子也可以是数字的背景会很有趣。这可能也有点帮助:谢谢!我不知道有这样一个谓词,它变得有点模糊。例如,如果我有两个事实,
喜欢(约翰,玛丽)。
喜欢(约翰,苏)。
喜欢/2
确实形成了一种关系,即使没有规则。另外,为了增加更多的模糊性,
add(X,Y,Z):-Z是X+Y。
相当于
:-(add(X,Y,Z),(Z是X+Y))
,可以将其视为一种结构。也许结构是任何一个复合术语,它将关系数据的含义与之关联(这使它也成为一个关系?)。是的,我不是想否定你的答案,只是想增加讨论的内容。@Lower别担心。如果我知道大部分答案,我知道评论会指出我缺乏知识的地方,然后我会学到一些东西。请继续评论,因为这有助于我学习。由于我有这本书的确切版本,我将进一步研究。@GuyCoder感谢您的广泛澄清。我认为这样说是正确的,即“结构”和“关系”只是查看数据库中数据的不同方式,只是术语问题(如,Prolog在更深层次上没有区分这两者)?我深入研究了一些权威参考文献,这就是我发现的。如果这没有回答你的问题,那么我没有更多的信息。首先Bratko让你感到疑惑,所以我检查了官方的Prolog规范(ISO/IEC 13211-1:1995(E)),它没有使用关系这个词。然而,reads
关系的另一个名称是谓词
,而谓词的ISO规范reads
一个标识符和一个arity
@潜伏者给了你一个很好的解释。
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