在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.