首页 文章

我的逻辑在哪里出错了?

提问于
浏览
0

作为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)三角形,圆形和四边形都是不同的,并且只能是一个(即没有属性重叠) .

以下是我查询prolog源时的内容 .

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

2)圆(rect) . 假(红色) .

3)圈(cir) . 如果没有' . ' (黑色),红色假 .

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

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

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

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

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

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

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

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

1 回答

  • 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中的评论 . 需要有关于尺寸或其他详细形状属性的一些信息 . 人们可以将属性作为每个形状的一部分(例如,对于边长为_1454547的正方形 square(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) 会回来假(圆形不是矩形,甚至是一种矩形) . 查询 sides(rectangle, 3). 为false .

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

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

相关问题