我是Prolog的新手,并逐渐通过Ivan Bratko的“人工智能Prolog编程”(第4版)。
做运动时2.1。 (第39页),我看不出为什么5(X,Y)
在语法上不正确,而+(north,west)
是正确的。起初我认为这与编码器是一个数字(因为我认为这只能是一个原子)这一事实有关,但根据这本书,原子也可以是一个数字。然后我认为参数是变量是一个问题,但我不明白为什么这会对语法正确性造成问题。有人能指出我正确的解释方向吗?
此外,我想知道关系和结构之间的确切区别。虽然date(1, may, 2001)
(第35页)被视为一个结构,但我想知道我们是否可以对第1章中的早期示例说同样的内容。例如,第一章中的关系parent(pam,bob)
也是如此一个所谓的结构,还是我混淆了什么?
提前致谢。
答案 0 :(得分: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
字符+
成功,因为规则2是特殊字符。
进一步探索这种方法的一种方法是使用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节按事实定义关系
通常,关系被定义为其所有实例的集合。例如,父级(tom,bob)是父级关系的特定实例。其他情况是:
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}给出数据。在给出最好的定义时,我可以说是一个特定的关系可以由许多具有相同算子的结构组成,但这不是一个在我的脑海中经过这段时间的想法。