У меня есть база данных, полная фактов, таких как:
overground(newcrossgate,brockley,2).
overground(brockley,honoroakpark,3).
overground(honoroakpark,foresthill,3).
overground(foresthill,sydenham,2).
overground(sydenham,pengewest,3).
overground(pengewest,anerley,2).
overground(anerley,norwoodjunction,3).
overground(norwoodjunction,westcroydon,8).
overground(sydenham,crystalpalace,5).
overground(highburyandislington,canonbury,2).
overground(canonbury,dalstonjunction,3).
overground(dalstonjunction,haggerston,1).
overground(haggerston,hoxton,2).
overground(hoxton,shoreditchhighstreet,3).
пример: newcrossgate to brockley занимает 2 минуты.
Затем я создал правило, так что если я введу запрос istime(newcrossgate, honoroakpark, Z).тогда пролог должен дать мне время, необходимое для путешествия между этими двумя станциями.(Правило, которое я сделал, предназначено для расчета расстояния между любыми двумя станциями, а не только соседними).
istime(X,Y,Z):- istime(X,Y,0,Z); istime(Y,X,0,Z).
istime(X,Y,T,Z):- overground(X,Y,Z), T1 is T + Z.
istime(X,Y,Z):- overground(X,A,T), istime(A,Y,T1), Z is T + T1.
istime(X,Y,Z):- overground(X,B,T), istime(B,X,T1), Z is T + T1.
кажется, что он идеально подходит для новых перекрестных врат на первые пару станций, например, новых перекрестных в лесной или лесной холм.Однако, после тестирования newcrossgate на westcroydon, которое занимает 26 минут, я попробовал newcrossgate to crystalpalace и пролог сказал, что это займет 15 минут ... несмотря на то, что это следующая станция после westcroydon.Ясно, что здесь что-то не так, однако это работает для большинства станций, время от времени появляясь со случайной ошибкой во времени, может кто-нибудь сказать мне, что не так?: S