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

标签 syntax prolog

我是 Prolog 新手,正在逐步阅读 Ivan Bratko 的“人工智能 Prolog 编程”(第 4 版)。

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

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

提前致谢。

最佳答案

I fail to see why 5(X,Y) is syntactically not correct, while +(north,west) is correct.

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

第 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) .

what the exact difference is between a relation and a structure

第 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 时,我不认为应该使用关系还是结构,我想到数据是如何构造的,它可以像数字一样简单或者更复杂的结构或结构的结构,然后在给定数据的情况下达到目标所需的谓词(规则)是什么。在查看给出的定义时,我能说的最好的一点是,一个特定的关系可以由具有相同仿函数的许多结构组成,但这并不是一个在这段时期之后会持续存在我脑海中的想法。

关于syntax - Prolog:语法正确的对象+关系与结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306615/

相关文章:

php - "Syntax error, unexpected T_STRING"goto 问题

c++ - 如何在 C++ 中创建静态类?

prolog - 在序言中获取单例警告(面额更改)

prolog - 定义规则时使用分号

sql - MS Access : SQL View error

list - Groovy 语言 : how to get difference between two lists of pairs

prolog - 在序言中排除 tuples_in 列表

prolog - 纯 Prolog 方案 Quine

python - 通过属性以及索引访问递归访问字典?

prolog - WAM 的替代品