2014-12-02 4 views
1

Я новичок в Prolog. Я пытаюсь сделать простую программу, которая находит расстояние между городами, используя рекурсивную структуру. Проблема возникает, когда я пытаюсь найти суммарное расстояние между городами, которые не связаны напрямую (например, Лондон до Сидней).Пролог: Расстояние между городами

distance(london,newyork,3.2). 
distance(london,capetown,5.8). 
distance(london,rome,0.8). 
distance(london,panama,4.5). 
distance(panama,sydney,7.7). 
distance(newyork,sanfrancisco,2.5). 
distance(newyork,panama,1.9). 
distance(sanfrancisco,sydney,6.2). 
distance(sanfrancisco,tokyo,4.5). 
distance(tokyo,calcutta,2.5). 
distance(tokyo,sydney,4.1). 
distance(sydney,calcutta,4.4). 
distance(sydney,capetown,6.0). 
distance(capetowm,rome,5.1). 
distance(calcutta,cairo,2.2). 
distance(cairo,rome,0.9). 

connected(X,Y,Distance):- 
    distance(X,Y,Distance). 
connected(X,Y,Distance):- 
    distance(X,Z,NewDistance), 
    connected(Z,Y,NewDistance), 
    Distance is Distance+NewDistance. 

ответ

1

Вы можете изменить ваше последнее правило так:

connected(X,Y,Distance):- distance(X,Z,Distance1), 
          distance(Z,Y,Distance2), 
          SumDistance is Distance1+Distance2, 
          write(SumDistance). 

Вот мой результат:

1 ?- connected(london,sydney,X). 
12.2 
true . 

Маршрут Лондон -> Панама -> Сидней. Я использовал trace., чтобы увидеть, как это работает:

2 ?- trace. 
true. 

[trace] 2 ?- connected(london,sydney,X) 
    .... 
    Redo: (7) distance(london, _G1945, _G1946) ? creep 
    Exit: (7) distance(london, panama, 4.5) ? creep 
    Call: (7) distance(panama, sydney, _G1950) ? creep 
    Exit: (7) distance(panama, sydney, 7.7) ? creep 
    Call: (7) _G1955 is 4.5+7.7 ? creep 
    Exit: (7) 12.2 is 4.5+7.7 ? creep 
    Call: (7) write(12.2) ? creep 
12.2 
    Exit: (7) write(12.2) ? creep 
    Exit: (6) connected(london, sydney, _G1871) ? creep 

(я удалил некоторые из отслеживания, потому что это было слишком долго).

+0

Большое спасибо! : D –

+0

Кажется, есть проблема с решением. Я получаю 5.1 вместо 4.5 для 'connected (london, panama, X). Точно так же для всех остальных одиночных предикатов выполнение ответ неверно. – faizanjehangir

Смежные вопросы