我是 Prolog 的新手,我的任務需要找到所有由 DB 點構建的等邊三角形。結果,我得到了三角形的相同點。我不明白問題是什么。請幫幫我!
:- dynamic
point/3.
%?Point_Sign, ?Abscissa, ?Ordinate
db_filling:-
point(_,_,_),!.
db_filling:-
assert(point(a,1,1)),
assert(point(b,1,2)),
assert(point(c,1,3)),
assert(point(d,2,2)),
assert(point(e,3,3)),
assert(point(f,-1,1)),
assert(point(g,-2,1)),
assert(point(h,-2,2)),
assert(point(i,-3,3)),
assert(point(j,-3,-1)),
assert(point(k,-3,-2)),
assert(point(l,-3,-3)),
assert(point(n,-1,-1)),
assert(point(m,-3,0)),
assert(point(o,3,0)),
assert(point(p,0,3)).
% List
points_main(Xs):-
db_filling,
findall(Xs1,equilateral_triangles(Xs1),Xs).
% Points
equilateral_triangles([P1,P2,P3]):-
point(P1,X1,Y1),
point(P2,X2,Y2),
point(P3,X3,Y3),
L1 is sqrt((X2 - X1)^2 (Y2 - Y1)^2),
L2 is sqrt((X3 - X2)^2 (Y3 - Y2)^2),
L3 is sqrt((X1 - X3)^2 (Y1 - Y3)^2),
L1 = L2,
L2 = L3.
結果:
?- points_main(Res).
Res = [[a, a, a], [b, b, b], [c, c, c], [d, d, d], [e, e, e], [f, f, f], [g, g|...], [h|...], [...|...]|...].
uj5u.com熱心網友回復:
您在這里有幾個基本問??題。
憑記憶,等邊三角形的二維坐標不可能都是整數。你必須至少有一個無理數。計算機不擅長表示無理數。
因此,您還將真正的數學與計算機數學混淆了。你不能簡單地得到sqrt并檢查是否相等。
為了說明,我提出了這三點:
point(j1,0,0).
point(j2,1,0).
point(j3,0.5,0.866025403784439). % 1/2 & sqrt(3)/2
那是一個等邊三角形。
當我用你的代碼運行它時,產生的長度是這樣的:
[1.0,1.0000000000000004,1.0000000000000004]
它們都是有效1.0的,但當然1.0000000000000004不是1.0。所以,即使這也不是平等的。
所以你真的被迫檢查信心作為一個 epsilon 說兩個數字相等。
這是我所做的:
points_main(Xs):-
findall(Xs1,equilateral_triangles(Xs1),Xs).
equilateral_triangles([P1,P2,P3]):-
point(P1,X1,Y1),
point(P2,X2,Y2),
P1 \= P2,
point(P3,X3,Y3),
P1 \= P3,
P2 \= P3,
L12 is sqrt((X2 - X1)^2 (Y2 - Y1)^2),
L23 is sqrt((X3 - X2)^2 (Y3 - Y2)^2),
L31 is sqrt((X1 - X3)^2 (Y1 - Y3)^2),
D1223 is abs(L12 - L23),
D1223<0.00000001,
D2331 is abs(L23 - L31),
D2331<0.00000001,
D3112 is abs(L31 - L12),
D3112<0.00000001.
現在,如果我反對我的上述觀點,我會得到:
?- points_main(Xs).
Xs = [[j1, j2, j3], [j1, j3, j2], [j2, j1, j3], [j2, j3, j1], [j3, j1, j2], [j3, j2, j1]].
以上三點的所有組合——所以,是的,它們都是等邊三角形。
如果我與您的原始點相悖,正如預期的那樣,沒有等邊三角形。
一些旁注。
(1) 我洗掉了所有assert代碼。讓您的代碼正常作業沒有幫助也沒有必要。
(2)您可以將我的j3觀點定義為point(j3,0.5,X) :- X is sqrt(3)/2.,并且您的原始數學將起作用。然而,這只是幸運。在處理浮點數時,您永遠無法確定兩個數字是否相等,即使它們應該相等。
(3)我介紹了P1 \= P2,等等,以防止積分自己統一。這就是你得到[a,a,a],...等的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490572.html
上一篇:修改資料框串列的列
