Swı-ProLog, belirli bir bitiş düğümüne ulaşabilecek tüm olası başlangıç düğümlerini bulma

0

Soru

Mantık programlamada yeniyim. Belirli bir düğüme ulaşabilecek tüm düğümleri bulabilen bir program yazmaya çalışıyorum.

İşte benim kodum:

link(0, 1).  
link(3, 4). 
link(1, 2).  
link(2, 0). 
link(2, 1).  
link(3, 2).  
link(4, 3).

Yani yukarıda grafikle göster, aşağıdaki gibi görünmelidir:

Graph

Böyle bir şey yapmak istiyorum :

?- go(X,0).
X=1;
X=2;
X=3;
X=4;
....

Bu, tüm 1,2,3 ve 4'ten 0'a gidebileceği anlamına gelir.

[1->2->0],[2->0],[3->2->0],[4->3->2->0]...

bu yüzden deniyorum

go(X,Y) :- link(X,Y).
go(X,Y) :- link(X,Z),go(Z,Y).

?- go(X,0).
X=2;
X=0;
X=0;
X=0;
X=0;
....

ancak çıktılardan biri olarak 0 istemiyorum, zaten 0'dayken 0'a gidebileceğimi göstermek anlamsızdır. Ayrıca, tekrarlamaya devam ediyor. Bu sorunu şu şekilde düzeltmeye çalışıyorum:

go(X,Y) :- link(X,Y).
go(X,Y) :- (X\==Y),link(X,Z),go(Z,Y).

?- go(X,0).
X = 2 ;
false.

Neden X=2'de duracağından emin değilim. ProLog arama ağacını çizmeye çalışıyorum ve kodumun neden diğer gerçekleri aramaya devam etmediğini hala bilmiyorum (link (3,4)). Bir noktada durmuş gibi görünüyor ve aşağıdaki yeşil kısım için devam etmiyor:

Search Tree

Go(1,0) kullanarak test etmeye çalışıyorum. gitmek için (4,0). git(1,0) ve git (2,0) başarı Ancak git (3,0) ve git(4,0) dönüş Hatası: Yığın sınırı. Özyinelemenin düğüm 3 ile 4 arasında gidip gelmeye devam ettiğini buldum. Ama nasıl çözeceğimi gerçekten bilmiyorum.

Şimdi kafam çok karıştı, lütfen bana hatamın ne olduğunu veya bu işlevi doğru bir şekilde nasıl uygulayacağımı söyle? Teşekkür ederim.

logic-programming prolog
2021-11-23 11:09:32
1

En iyi cevabı

0

Sorun, grafiğinizin asiklik grafikten ziyade döngüsel olmasıdır. Bu, bazı düğümlerden başlamak anlamına gelir X, sen [eninde sonunda] döneceksin X.

Bu, (yeni başlayanlar için) döngüleri bir şekilde ele almadığınız sürece, sonsuz bir özyinelemeli döngüde (yığın alanı bitene kadar) sıkışıp kalacağınız anlamına gelir.

Grafiği geçerken, bazı ek durumları (daha önce ziyaret ettiğiniz düğümlerin listesi) korumanız gerekir. Bunu Prologda yapmak için, aynı ada sahip, ancak ek durumu taşıyan ek argümanlara sahip bir yardımcı yüklemi kullanmak yaygın bir deyimdir.

Yani, böyle bir şey dene:

% the public predicate. We seed the visited list here
% with our starting node.
%
% Not to worry if it is an unbound
% variable. It will become bound/unbound as necessary.
traverse(A,B) :- traverse(A,B,[A]).

traverse(A,B,V) :-    % We can get from A to B, if...
  link(A,B),          % - A and B are directly connected, and
  \+ member(B,V)      % - we haven't already visited B
  .                   % - easy!
traverse(A,B,V) :-    % Otherwise, we can get from A to B, if...
  link(A,X),          % - we can get to some intermediate node X,
  \+ member(X,V)      % - that we have not yet visited, and
  traverse(X,B,[X|V]) % - we can get from X to B (adding X to the visited list
  .
2021-11-24 04:50:58

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................