在prolog中处理对象拓扑:从三角形列表中查找双向边

在prolog中处理对象拓扑:从三角形列表中查找双向边,prolog,Prolog,这是我想做的 鉴于宣言: vertex(v0, coord(-1.0, 1.0, 0.0)). vertex(v1, coord(1.0, 1.0, 0.0)). vertex(v2, coord(-1.0, -1.0, 0.0)). vertex(v3, coord(1.0, -1.0, 0.0)). face(f0, v0, v1, v2). face(f1, v0, v2, v3). bidirEdge(A, B) :- edge(A, B), edge(B, A).

这是我想做的

鉴于宣言:

vertex(v0, coord(-1.0, 1.0, 0.0)).
vertex(v1, coord(1.0, 1.0, 0.0)).
vertex(v2, coord(-1.0, -1.0, 0.0)).
vertex(v3, coord(1.0, -1.0, 0.0)).

face(f0, v0, v1, v2).
face(f1, v0, v2, v3).

bidirEdge(A, B) :-
    edge(A, B),
    edge(B, A).
运行查询
bidirEdge(X,Y)。
并接收
X=v0,Y=v2;Y=v0,X=v2作为答案

声明是简单三维四元结构的拓扑:

 v0----v1
 | \ f0 |
 |  \   |
 |   \  |
 | f1 \ |
 v3----v2
其中v0..v3表示顶点索引,f0..f1表示面

我该怎么做

我已经尝试过的:

我试图将
face
声明为:

face(_, A, B, C) :-
    vertex(A, _),
    vertex(B, _),
    vertex(C, _),
    edge(A, B),
    edge(B, C),
    edge(C, A).
一开始,查询就不起作用,因为prolog不知道“edge”是什么意思

如果我尝试

edge(A, B) :-
    vertex(A, _),
    vertex(B, _).
或者(不太正确)

这导致了有趣的输出

63 ?- edge(X, Y).
X = Y, Y = v0 ;
X = v0,
Y = v1 ;
X = v0,
Y = v2 ;
X = v0,
Y = v3 ;
X = v1,
Y = v0 ;
X = Y, Y = v1 ;
X = v1,
Y = v2 ...
基本上,prolog“总结”了“对于所有声明的顶点,有一条边连接它们”,并列出了所有可能的连接:

 v0--v1
 | \/ |
 | /\ |
 v3--v2
这几乎忽略了我提供的拓扑,而不是我想要的

我想如果我做这样的事情:

faceEdge(FaceID, A, B) :-
    belongsTo(FaceID, edge(A, B)).

face(FaceID, A, B, C) :-
    vertex(A, _),
    vertex(B, _),
    vertex(C, _),
    faceEdge(FaceID, A, B),
    faceEdge(FaceID, B, C),
    faceEdge(FaceID, C, A).
我应该得到所需的行为,但我不知道如何将
声明为
(而且我有一种预感,这不是应该怎么做的),这种查询往往会导致无限循环并挂起我的swi prolog

主要的问题似乎是,我希望prolog为我确定边的列表,而不显式地指定它,这意味着在遇到“face(A,B,C)”时,它应该将其视为seeral“edge()”语句,而我对“edge”的声明是不正确的

那么,在这种情况下,我如何正确地声明“边缘”?

保持简单:

edge(X, Y) :- face(_, A, B, C), (X=A,Y=B ; X=B,Y=C ; X=C,Y=A).
你会得到

?- bidirEdge(X,Y).
X = v2,
Y = v0 ;
X = v0,
Y = v2 ;
false.

解决方案顺序与要求不匹配。应该很容易根据需要进行更改…

解决方案顺序没有要求,只要能够找到双向边,任何方法都可以。经过测试,它可以正常工作。感谢您的帮助/快速响应。
?- bidirEdge(X,Y).
X = v2,
Y = v0 ;
X = v0,
Y = v2 ;
false.