我的逻辑在哪里出错了?

时间:2015-01-26 14:45:51

标签: prolog

作为Prolog的初学者,只有Java编程的先前知识,我发现很难将逻辑与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)宇宙只有3种形状:三角形,圆形和四边形。

2)四边形可以是正方形或矩形(不是两个)。

3)任何有颜色的东西可能不是四边形,但四边形必须只有红色或黄色。

4)正方形是唯一具有4个相等边的四边形

5)三角形是唯一具有3条边的形状。

6)三角形,圆形和四边形都是不同的,并且只能是一个(即没有属性重叠)。

以下是我查询序言源时的内容。

1)圈(三)。 -false(红色)。

2)圈(rect)。假(红色)。

3)圈(cir)。没有'是真的。' (黑色),红色假。

4)四边形(rect)。 true(黑色),true(黑色),超出本地堆栈(红色)

5)四边形(cir)。真(黑色),假(红色)

6)四边形(三)。真(黑色),假(红色)

7)三角形(rect)。假(红色)

8)三角形(cir)。假(红色)

9)三角形(三)。真(黑色)假(红色)

10)hasThreeEdge(rect)。错误。顶级未定义程序:游泳/ 1(红色)< - 这是什么意思?当我查询圆圈和三角形时答案是一样的!

这似乎有些事我做错了......

1 个答案:

答案 0 :(得分:0)

我认为你对Prolog的知识表达有点间接。让我们从你的假设开始:

1)宇宙只有3种形状:三角形,圆形和四边形。

这表明我们可能想要定义一个名为shape的事实/谓词并断言其中三个:

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(Shape, quadrilateral).查询kind_of(circle, rectangle)查询形状是否为一种四边形回来假(圆圈不是矩形,甚至是一种矩形)。查询sides(rectangle, 3).为false。

关于尺寸信息,如果您对表示特定对象感兴趣,例如给定半径的圆或给定边长的矩形,则可以增加形状的表示以包含这些属性。例如,您可以circle代替circle(R),其中R是某些任意单位的半径。矩形可以是rectangle(L, W)等。您的shape事实可能看起来像shape(circle(_)). shape(quadrilateral(_,_,_,_)).等。

如何实现这一点很大程度上取决于您希望如何使用它。但最重要的是决定表达知识的合理方式,然后代表规则。此外,一般来说,我会尽量避免在否定(\+)的结合方面定义规则,并尝试以积极的方式定义事物,并且让规则或事实的缺失导致失败。