我的逻辑哪里错了?
Where did my logic go wrong?
作为仅具有 Java 编程知识的 prolog 初学者,我发现很难将逻辑关联到 prolog 规则中...
以下是我到目前为止的情况,考虑到我得到的结果,我希望任何人指出我哪里做错了。
shapes(X):-triangle(X); circle(X); quadrilateral(X); withColour(X).
square(sq).
rectangle(rect).
circle(cir).
triangle(tri).
quadrilateral(X).
quadrilateral(X):-square(X).
quadrilateral(X):-rectangle(X).
red(X):-quadrilateral(X).
yellow(X):-quadrilateral(X).
withColour(X):-red(X).
withColour(X):-yellow(X).
fourEqualside(square(X),length).
quadrilateral(X):- \+triangle(X), \+circle(X), shapes(X).
triangle(X):-hasThreeEdge(X).
triangle(X):- \+circle(X), \+rectangle(X), \+withColour(X), shapes(X), hasThreeEdge(X).
circle(X):-\+quadrilateral(X), \+triangle(X),\+withColour(X), shapes(X).
以下是我的假设:
1)宇宙只有三角形、圆形和四边形三种形状。
2) 四边形可以是正方形或长方形(不能同时是长方形)。
3) 任何有颜色的东西都不能是四边形,但四边形必须只有红色或黄色。
4) 正方形是唯一具有 4 个相等边的四边形
5) 三角形是唯一具有 3 条边的形状。
6) 三角形、圆形和四边形都是不同的,并且只能是其中之一(即属性没有重叠)。
下面是我查询序言源码时得到的
1) 圆(tri)。 -false(红色)。
2) 圆形(矩形)。错误(红色)。
3) 圆(cir)。不带 '.' 的真(黑色),红色错误。
4) 四边形(矩形)。 true(黑色),true(黑色),超出本地堆栈(红色)
5) 四边形(cir)。真(黑色),假(红色)
6) 四边形(tri)。真(黑色),假(红色)
7) 三角形(矩形)。错误(红色)
8) 三角形(cir)。错误(红色)
9) 三角形(tri)。真(黑)假(红)
10) hasThreeEdge(矩形)。错误。顶级未定义过程:swim/1(红色)<- 这是什么意思?当我查询圆形和三角形时答案也是一样的!
我好像哪里做错了...
我认为您将知识表示为 Prolog 有点间接。让我们从您的假设开始:
1)宇宙只有三角形、圆形和四边形三种形状。
这表明我们可能想要定义一个名为 shape
的 fact/predicate 并断言其中三个:
shape(triangle).
shape(circle).
shape(quadrilateral).
如果您随后查询,shape(X)
(X
是一个形状),Prolog 将响应:
X = triangle
X = circle
X = quadrilateral
2) 四边形可以是正方形或长方形(不能同时是长方形)。
假设 #1 表示只有三种形状:三角形、圆形或四边形。但是假设 #2 违反了假设 #1。假设我们通过添加更多形状来解决这个问题:
shape(square).
shape(rectangle).
然后我们可以包括,例如:
kind(rectangle, quadrilateral).
kind(square, rectangle).
kind_of(X, Y) :- kind(X, Y).
kind_of(X, Y) :- kind(X, Z), kind(Z, Y).
则kind_of(square, rectangle)
为真,kind_of(rectangle, quadrilateral)
为真,kind_of(square, quadrilateral)
为真。
| ?- kind_of(X, Y).
X = rectangle
Y = quadrilateral ? ;
X = square
Y = rectangle ? ;
X = square
Y = quadrilateral
yes
最初的假设也是一个缺陷,因为正方形确实是矩形的一种。所以一个四边形可以既是正方形又是长方形,如果它是正方形的话。
3) 任何有颜色的东西都不能是四边形,但四边形必须只有红色或黄色。
这个有点不清楚。 可以,你是说可以还是不可以?或者你的意思是必须?如果必须,那么这显然是矛盾的。所以我假设这意味着 可能会或可能不会 ?
您需要引入有效的颜色。一种方法是:
color(red).
color(yellow).
color(black).
...
您可以指出形状具有哪些有效颜色:
shape_color(quadrilateral, red).
shape_color(quadrilateral, yellow).
shape_color(triangle, X) :- color(X). % a triangle can be any valid color
4) 正方形是唯一具有 4 个相等边的四边形
请参阅我在#2 中的评论。需要有一些关于尺寸或其他详细形状属性的信息。甚至可以将属性作为每个形状的一部分(例如、square(S)
用于边长 S
的正方形,或 triangle(S1,S2,S3)
对于具有给定边长的三角形)。不过,我假设您只想泛指形状。所以我们需要关于它们几何形状的事实。您如何定义这些以及它们的详细程度完全取决于您的需要。但为了简单起见:
equal_sides(square, 4). % all 4 sides equal
equal_sides(rectangle, 2). % opposing 2 sides equal
对 equal_sides(square, 4).
的查询为真,
5) 三角形是唯一具有 3 条边的形状。
这可以使用一组关于形状有多少条边的事实来完成:
sides(triangle, 3).
sides(square, 4).
sides(rectangle, 4).
sides(quadrilateral, 4).
6) 三角形、圆形和四边形都是不同的,并且只能是其中之一(即没有属性重叠)。
以上所有情况自然会发生这种情况。
上述方法可以支持许多查询和其他谓词。如果你有一个变量,Shape
,你可以询问它是否是一个有效的形状,shape(Shape).
。您还可以通过 kind_of(Shape, Kind).
查看它是否是 "kind of" 更具体地说,您可以通过 kind_of(Shape, quadrilateral).
查询 kind_of(circle, rectangle)
来询问形状是否是一种四边形会返回 false(圆形不是矩形,甚至不是一种矩形)。查询 sides(rectangle, 3).
为假。
关于维度信息,如果您对表示特定对象感兴趣,例如给定半径的圆或给定边长的矩形,您可以增加形状的表示以包括这些属性。例如,您可以使用 circle(R)
而不是 circle
,其中 R
是某些任意单位的半径。矩形可以是 rectangle(L, W)
等。您的 shape
事实可能看起来像 shape(circle(_)). shape(quadrilateral(_,_,_,_)).
等
你如何实现它在很大程度上取决于你想如何使用它。但最重要的是决定以合理的方式表示知识,然后表示规则。此外,一般来说,我会尽量避免根据否定的连词 (\+
) 来定义规则,并尝试以积极的方式定义事物,让规则或事实的缺失导致失败。
作为仅具有 Java 编程知识的 prolog 初学者,我发现很难将逻辑关联到 prolog 规则中...
以下是我到目前为止的情况,考虑到我得到的结果,我希望任何人指出我哪里做错了。
shapes(X):-triangle(X); circle(X); quadrilateral(X); withColour(X).
square(sq).
rectangle(rect).
circle(cir).
triangle(tri).
quadrilateral(X).
quadrilateral(X):-square(X).
quadrilateral(X):-rectangle(X).
red(X):-quadrilateral(X).
yellow(X):-quadrilateral(X).
withColour(X):-red(X).
withColour(X):-yellow(X).
fourEqualside(square(X),length).
quadrilateral(X):- \+triangle(X), \+circle(X), shapes(X).
triangle(X):-hasThreeEdge(X).
triangle(X):- \+circle(X), \+rectangle(X), \+withColour(X), shapes(X), hasThreeEdge(X).
circle(X):-\+quadrilateral(X), \+triangle(X),\+withColour(X), shapes(X).
以下是我的假设:
1)宇宙只有三角形、圆形和四边形三种形状。
2) 四边形可以是正方形或长方形(不能同时是长方形)。
3) 任何有颜色的东西都不能是四边形,但四边形必须只有红色或黄色。
4) 正方形是唯一具有 4 个相等边的四边形
5) 三角形是唯一具有 3 条边的形状。
6) 三角形、圆形和四边形都是不同的,并且只能是其中之一(即属性没有重叠)。
下面是我查询序言源码时得到的
1) 圆(tri)。 -false(红色)。
2) 圆形(矩形)。错误(红色)。
3) 圆(cir)。不带 '.' 的真(黑色),红色错误。
4) 四边形(矩形)。 true(黑色),true(黑色),超出本地堆栈(红色)
5) 四边形(cir)。真(黑色),假(红色)
6) 四边形(tri)。真(黑色),假(红色)
7) 三角形(矩形)。错误(红色)
8) 三角形(cir)。错误(红色)
9) 三角形(tri)。真(黑)假(红)
10) hasThreeEdge(矩形)。错误。顶级未定义过程:swim/1(红色)<- 这是什么意思?当我查询圆形和三角形时答案也是一样的!
我好像哪里做错了...
我认为您将知识表示为 Prolog 有点间接。让我们从您的假设开始:
1)宇宙只有三角形、圆形和四边形三种形状。
这表明我们可能想要定义一个名为 shape
的 fact/predicate 并断言其中三个:
shape(triangle).
shape(circle).
shape(quadrilateral).
如果您随后查询,shape(X)
(X
是一个形状),Prolog 将响应:
X = triangle
X = circle
X = quadrilateral
2) 四边形可以是正方形或长方形(不能同时是长方形)。
假设 #1 表示只有三种形状:三角形、圆形或四边形。但是假设 #2 违反了假设 #1。假设我们通过添加更多形状来解决这个问题:
shape(square).
shape(rectangle).
然后我们可以包括,例如:
kind(rectangle, quadrilateral).
kind(square, rectangle).
kind_of(X, Y) :- kind(X, Y).
kind_of(X, Y) :- kind(X, Z), kind(Z, Y).
则kind_of(square, rectangle)
为真,kind_of(rectangle, quadrilateral)
为真,kind_of(square, quadrilateral)
为真。
| ?- kind_of(X, Y).
X = rectangle
Y = quadrilateral ? ;
X = square
Y = rectangle ? ;
X = square
Y = quadrilateral
yes
最初的假设也是一个缺陷,因为正方形确实是矩形的一种。所以一个四边形可以既是正方形又是长方形,如果它是正方形的话。
3) 任何有颜色的东西都不能是四边形,但四边形必须只有红色或黄色。
这个有点不清楚。 可以,你是说可以还是不可以?或者你的意思是必须?如果必须,那么这显然是矛盾的。所以我假设这意味着 可能会或可能不会 ?
您需要引入有效的颜色。一种方法是:
color(red).
color(yellow).
color(black).
...
您可以指出形状具有哪些有效颜色:
shape_color(quadrilateral, red).
shape_color(quadrilateral, yellow).
shape_color(triangle, X) :- color(X). % a triangle can be any valid color
4) 正方形是唯一具有 4 个相等边的四边形
请参阅我在#2 中的评论。需要有一些关于尺寸或其他详细形状属性的信息。甚至可以将属性作为每个形状的一部分(例如、square(S)
用于边长 S
的正方形,或 triangle(S1,S2,S3)
对于具有给定边长的三角形)。不过,我假设您只想泛指形状。所以我们需要关于它们几何形状的事实。您如何定义这些以及它们的详细程度完全取决于您的需要。但为了简单起见:
equal_sides(square, 4). % all 4 sides equal
equal_sides(rectangle, 2). % opposing 2 sides equal
对 equal_sides(square, 4).
的查询为真,
5) 三角形是唯一具有 3 条边的形状。
这可以使用一组关于形状有多少条边的事实来完成:
sides(triangle, 3).
sides(square, 4).
sides(rectangle, 4).
sides(quadrilateral, 4).
6) 三角形、圆形和四边形都是不同的,并且只能是其中之一(即没有属性重叠)。
以上所有情况自然会发生这种情况。
上述方法可以支持许多查询和其他谓词。如果你有一个变量,Shape
,你可以询问它是否是一个有效的形状,shape(Shape).
。您还可以通过 kind_of(Shape, Kind).
查看它是否是 "kind of" 更具体地说,您可以通过 kind_of(Shape, quadrilateral).
查询 kind_of(circle, rectangle)
来询问形状是否是一种四边形会返回 false(圆形不是矩形,甚至不是一种矩形)。查询 sides(rectangle, 3).
为假。
关于维度信息,如果您对表示特定对象感兴趣,例如给定半径的圆或给定边长的矩形,您可以增加形状的表示以包括这些属性。例如,您可以使用 circle(R)
而不是 circle
,其中 R
是某些任意单位的半径。矩形可以是 rectangle(L, W)
等。您的 shape
事实可能看起来像 shape(circle(_)). shape(quadrilateral(_,_,_,_)).
等
你如何实现它在很大程度上取决于你想如何使用它。但最重要的是决定以合理的方式表示知识,然后表示规则。此外,一般来说,我会尽量避免根据否定的连词 (\+
) 来定义规则,并尝试以积极的方式定义事物,让规则或事实的缺失导致失败。