Prolog:语法上正确的对象+关系与结构

时间:2017-07-25 14:43:33

标签: syntax prolog

我是Prolog的新手,并逐渐通过Ivan Bratko的“人工智能Prolog编程”(第4版)。

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

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

提前致谢。

1 个答案:

答案 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

  • 失败了规则1,因为字符串不以下划线开头 字符或小写字母
  • 因规则2而失败,因为它不是一个规则 特殊字符
  • 未通过规则3,因为它未被封闭 用单引号

字符+成功,因为规则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}给出数据。在给出最好的定义时,我可以说是一个特定的关系可以由许多具有相同算子的结构组成,但这不是一个在我的脑海中经过这段时间的想法。