আমি একটি সংক্ষিপ্ত ক্লিঙ্গো প্রোগ্রাম চালিয়েছি যা কোনও টিএফএএস ছাড়াই কোনও গ্রাফের প্রতিবেদন করেনি, তবে একটি বাগ রয়েছে। আমি এটি স্থির করেছি এবং এখন এটি এনফায়ার করে নেই যে কোনও টিএফএএস ছাড়া এন = 8 বা তারও কম কোনও গ্রাফ নেই। এন = 9 এর জন্য এটি এটি খুঁজে পেয়েছে:
is_edge(edge(2,3)) is_edge(edge(1,4)) is_edge(edge(2,4)) is_edge(edge(3,5)) is_edge(edge(4,5)) is_edge(edge(1,6)) is_edge(edge(2,6)) is_edge(edge(3,6)) is_edge(edge(5,6)) is_edge(edge(1,7)) is_edge(edge(4,7)) is_edge(edge(5,7)) is_edge(edge(6,7)) is_edge(edge(1,8)) is_edge(edge(3,8)) is_edge(edge(4,8)) is_edge(edge(5,9)) is_edge(edge(6,9)) is_edge(edge(7,9)) is_edge(edge(2,1)) is_edge(edge(3,1)) is_edge(edge(4,3)) is_edge(edge(5,1)) is_edge(edge(5,2)) is_edge(edge(6,4)) is_edge(edge(7,2)) is_edge(edge(7,3)) is_edge(edge(8,2)) is_edge(edge(8,5)) is_edge(edge(8,6)) is_edge(edge(8,7)) is_edge(edge(9,1)) is_edge(edge(9,2)) is_edge(edge(9,3)) is_edge(edge(9,4)) is_edge(edge(9,8))
এখানে (স্থির) এনকোডিং রয়েছে
% tfas.asp
#show is_edge/1.
vertex(1..n).
opp_edges(edge(A,B),edge(B,A)) :- vertex(A), vertex(B), A < B.
possible_edge(E1;E2) :- opp_edges(E1,E2).
{is_edge(E1); is_edge(E2)} = 1 :- opp_edges(E1, E2).
ntfas(E) :- possible_edge(E), not is_edge(E).
ntfas(edge(X, X)) :- vertex(X).
tfas(E) | fs(E) :- is_edge(E).
ntfas(E) :- fs(E).
broken :- ntfas(edge(A,C)), tfas(edge(A, B)), tfas(edge(B,C)).
reachable(X, Y) :- fs(edge(X, Y)), is_edge(edge(X, Y)).
reachable(X, Z) :- reachable(X, Y), fs(edge(Y, Z)), is_edge(edge(Y, Z)).
broken :- reachable(X, X).
tfas(E) :- broken, possible_edge(E).
fs(E) :- broken, possible_edge(E).
:- not broken.
এটি দিয়ে চালান clingo -c n=7 tfas.asp
(ক্লিঙ্গো ৪.২.১ ব্যবহার করে)
(n = 7 হ'ল 7 টি শীর্ষ কোণের চিত্রগুলি নির্দেশ করে)
এটি কেবলমাত্র 7 টি শীর্ষে কোনও টিএফএএসবিহীন কোনও গ্রাফ উপস্থিত থাকলে এবং এটি সন্তুষ্ট ফিরতে হবে।
ঠিক আছে, আমি বুঝতে পারলাম @ জি.বাচ কোন গ্রাফটি বর্ণনা করছে এবং এটি ক্লিঙ্গোতে কোড করেছে (নীচের ক্লিঙ্গো বর্ণনাটি দেখুন It এটি গ্যাজেট গ্রাফের একটি বিবরণ দিয়ে শুরু হয় এবং সম্পূর্ণরূপে এটির অনুলিপিগুলিতে কীভাবে যোগদান করতে হয় তা বর্ণনা করতে এগিয়ে যায়) 34-ভার্টেক্স টুর্নামেন্টের গ্রাফ জি.বাচ বর্ণনা করছেন I've আমি গ্রাউন্ডেড গ্রাফের বিবরণটিও সংযুক্ত করেছি)।
আমি তখন সেই গ্রাফটিতে ক্লিঙ্গো চালাতে এগিয়ে গেলাম এবং এটি দাবি করেছে যে 241 প্রান্তযুক্ত একটি টিএফএএস পাওয়া গেছে। তবে আমি গ্রাফ এনকোডিংয়ে ভুল করেছি। আমি ভুলটি সংশোধন করেছি এবং ক্লিঙ্গো এখন অসন্তুষ্টিজনক প্রতিবেদন করেছে (অর্থাত্ কোনও টিএফএএস নেই)।
একটি গ্রাফে টিএফএএস এর সন্ধানের জন্য এখানে প্রোগ্রাম
{tfas(E)} :- is_edge(E).
:- not tfas(edge(A,C)), tfas(edge(A, B)), tfas(edge(B,C)).
reachable(X, Y) :- not tfas(edge(X, Y)), is_edge(edge(X, Y)).
reachable(X, Z) :- reachable(X, Y), not tfas(edge(Y, Z)), is_edge(edge(Y, Z)).
:- reachable(X, X).
tfas_count(N) :- N = #count{tfas(E) : tfas(E)}.
#show tfas/1.
#show tfas_count/1.
জি.বাচের গ্রাফ তৈরির জন্য এখানে (আপডেট করা) প্রোগ্রামটি রয়েছে's গ্রাফটি একটি সুগঠিত টুর্নামেন্টের গ্রাফ কিনা তা পরীক্ষা করতে আমি শেষে সূচকগুলি যুক্ত করেছি:
gadget_vertex(0..7).
gadget_edge(0,1).
gadget_edge(0,2).
gadget_edge(0,3).
gadget_edge(0,4).
gadget_edge(1,2).
gadget_edge(1,3).
gadget_edge(1,6).
gadget_edge(1,7).
gadget_edge(2,3).
gadget_edge(2,4).
gadget_edge(2,5).
gadget_edge(2,7).
gadget_edge(3,4).
gadget_edge(3,5).
gadget_edge(3,6).
gadget_edge(4,1).
gadget_edge(4,5).
gadget_edge(4,6).
gadget_edge(4,7).
gadget_edge(5,0).
gadget_edge(5,1).
gadget_edge(5,6).
gadget_edge(6,0).
gadget_edge(6,2).
gadget_edge(6,7).
gadget_edge(7,0).
gadget_edge(7,3).
gadget_edge(7,5).
special_edge(a;b;c;d;e).
forces(a,b).
forces(b,c).
forcesn(c,a).
nforces(a,d).
forces(d,e).
forces(e,a).
relates(A,B) :- forces(A,B).
relates(A,B) :- nforces(A,B).
relates(A,B) :- forcesn(A,B).
is_se_pair(se_pair(A,B)) :- relates(A,B).
vertex_name(v(V,P)) :- gadget_vertex(V), is_se_pair(P).
matches(from(A), v(5, se_pair(A,B))) :- forces(A,B).
matches(to(A), v(1, se_pair(A,B))) :- forces(A,B).
matches(from(B), v(3, se_pair(A,B))) :- forces(A,B).
matches(to(B), v(6, se_pair(A,B))) :- forces(A,B).
matches(from(A), v(2, se_pair(A,B))) :- nforces(A,B).
matches(to(A), v(7, se_pair(A,B))) :- nforces(A,B).
matches(from(B), v(1, se_pair(A,B))) :- nforces(A,B).
matches(to(B), v(3, se_pair(A,B))) :- nforces(A,B).
matches(from(A), v(7, se_pair(A,B))) :- forcesn(A,B).
matches(to(A), v(3, se_pair(A,B))) :- forcesn(A,B).
matches(from(B), v(5, se_pair(A,B))) :- forcesn(A,B).
matches(to(B), v(1, se_pair(A,B))) :- forcesn(A,B).
same_vertex(V, V) :- vertex_name(V).
same_vertex(M, N; N, M) :- matches(X, M), matches(X, N).
already_found(v(Y,N2)) :- vertex_name(v(X,N1)), same_vertex(v(X,N1),v(Y,N2)), N1 < N2.
vertex(V) :- vertex_name(V), not already_found(V).
named_gadget_edge(edge(v(X,SE),v(Y,SE))) :- gadget_edge(X,Y), is_se_pair(SE).
from_gadget_edge_named(edge(A, B), edge(C,D)) :- named_gadget_edge(edge(C,D)), same_vertex(A,C), same_vertex(B,D), vertex(A), vertex(B).
from_gadget_edge(edge(A,B)) :- from_gadget_edge_named(edge(A,B),edge(C,D)).
is_edge(E) :- from_gadget_edge(E).
is_edge(edge(A,B)) :- vertex(A), vertex(B), A < B, not from_gadget_edge(edge(B,A)).
vertex_count(VN) :- VN = #count{vertex(V) : vertex(V)}.
edge_count(EN) :- EN = #count{is_edge(E) : is_edge(E)}.
#show vertex_count/1.
#show edge_count/1.
bidirectional :- is_edge(edge(A,B)), is_edge(edge(B,A)).
phantom_vertex :- is_edge(edge(A,B)), not vertex(A).
phantom_vertex :- is_edge(edge(A,B)), not vertex(B).
incomplete :- vertex(A), vertex(B), not is_edge(edge(A,B)), not is_edge(edge(B,A)), A != B.
#show bidirectional/0.
#show phantom_vertex/0.
#show incomplete/0.