2011-11-29 19 views
9

Benzer sorulara baktım ama sorunumla alakalı hiçbir şey bulamadım. BenBasitleştirilmiş Gezici Satış Noktası Prolog

distance(City1,City2,Distance) 

gerçekleri bir veritabanı kullanılarak, CityA den CityB yolunu bulacaksınız 'döngüler' bir algoritma veya set bulmak için mücadele ediyorum. Şimdiye kadar yapmayı başardığım şey aşağıda, ancak her zaman write(X),'da geri dönüyor ve son yinelemeyle tamamlanıyor, bunu yapmak istediğim şey sadece belli bir dereceye kadar. Örneğin, son çıkarılan veya son yinelemeyi kullanmak için herhangi bir şehir adını yazdırmasını istemiyorum. Temel olarak CityA ile CityB arasında bir yol yapmasını ve yolunda gittiği şehirlerin adını yazmasını istiyorum.

Umarım birileri bana yardım edebilir!

all_possible_paths(CityA, CityB) :- 
    write(CityA), 
    nl, 
    loop_process(CityA, CityB). 

loop_process(CityA, CityB) :- 
    CityA == CityB. 
loop_process(CityA, CityB) :- 
    CityA \== CityB, 
    distance(CityA, X, _), 
    write(X), 
    nl, 
    loop_process(X, CityB). 

cevap

7

Çalıştığınız şeyi nasıl daha iyi anlayabileceğinizi göstermeye çalıştım, böylece nasıl çalıştığını daha iyi anlayabilirsiniz. OP'iniz pek eksiksiz olmadığından bazı özgürlükler aldım! İşte

road(birmingham,bristol, 9). 
road(london,birmingham, 3). 
road(london,bristol, 6). 
road(london,plymouth, 5). 
road(plymouth,london, 5). 
road(portsmouth,london, 4). 
road(portsmouth,plymouth, 8). 

biz get_road/4 bizim yollarını bulmak için arayacak yüklem olduğu: İşte çalışıyorum gerçeklerdir. Temel olarak, iki akümülatöre sahip olan (daha önce ziyaret edilen noktalar için bir tane ve geçtiğimiz mesafe için bir tane olan) çalışma yüklemesini çağırır. (+ Başlangıç, + End, + Ara noktalar, + DistanceAcc, -Visited, -TotalDistance) get_road: Burada

get_road(Start, End, Visited, Result) :- 
    get_road(Start, End, [Start], 0, Visited, Result). 

,
get_road/6 çalışma yüklem
ilk fıkra anlatırsa o İlk noktamız ile son noktamız arasında bir yol var, burada bitebiliriz.

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :- 
    road(Start, End, Distance), 
    reverse([End|Waypoints], Visited), 
    TotalDistance is DistanceAcc + Distance. 

ikinci fıkra ilk nokta ve bir ara nokta arasında bir yol varsa, bunu alıp sonra get_road (orta, uç) çözebilir söyler.

?- get_road(portsmouth, plymouth, Visited, Distance). 

Ve verimi: Ben size yararlı olabileceğini ümit

Visited = [portsmouth, plymouth], 
Distance = 8 ; 
Visited = [portsmouth, london, plymouth], 
Distance = 9 ; 
Visited = [portsmouth, plymouth, london, plymouth], 
Distance = 18 ; 
false. 

şöyle

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :- 
    road(Start, Waypoint, Distance), 
    \+ member(Waypoint, Waypoints), 
    NewDistanceAcc is DistanceAcc + Distance, 
    get_road(Waypoint, End, [Waypoint|Waypoints], NewDistanceAcc, Visited, TotalDistance). 

Kullanımı olduğunu.

+0

Siz efendim, görev çağrısı yukarıda ve öteye gitti! Bu inanılmaz, mükemmel ve aslında mantıklı! Üzgünüm ben böyle bir kukla, ben prolog için gerçekten yeniyim ve çok fazla doğal olarak geldi gerçekten bu görevle gerçekten uğraştım. Çok çok çok çok sooooo çok:] –

+0

Bu kodu anlamak için tekrar mücadele eğer başka soru göndermek için çekinmeyin, ben veya diğerleri yorumlarda onlara cevap verecektir :) – m09

1

Sen all_possible_paths bir tanesinde değişken olarak başarılı bir liste dönmelidir. O zaman bu listeyi yazınız. Her ikisini de aynı prosedürde yapmayın.

+0

Yardımlarınız için teşekkür ederiz:] –

4

saf olmayan saf bölümü ayrı edin (I/O write/1, nl/0 değil, aynı zamanda (==)/2 ve (\==)/2 gibi). Tamamen saf kodunuzla karışmış oldukları sürece çok fazla bekleyemezsiniz.

Muhtemelen başlangıç ​​noktası, bitiş noktası ve aralarındaki yol arasında bir ilişki olmasını istersiniz.

Bu yol, çevrimsel mi yoksa döngülerine izin veriyor mu?

golü maplist(dif(X),Xs). kullanmak bir eleman X bir liste Xs oluşmaz emin olmak için bu güzel ilişki yapmak için daha fazla yardımcı yüklemler gerek yok!

+0

Bir şehir kullanıldıktan sonra, aynı yolla tekrar kullanılamaz. Yani, asiklik. Ayrıca saf ve saf olmayan ile ne demek istiyorsun? –

+0

Yukarıda bir açıklama ekledim. – false

+0

Yardımlarınız için teşekkürler! :] –