2016-02-04 4 views
0

У меня есть следующий кодКак я найти наименьшее значение в прологе

option(2):- 
    write('Enter place of origin: '), read(Origin), 
    write('Enter place of destination: '), read(Destination), 
    path(Origin, Destination, Path, Length),nl,nl, 
    printPath(Path), write(' '), 
    writef(' TOTAL DISTANCE = %d', [Length]),nl,fail;true. 

И я хотел найти наименьшее значение среди длин. Я получаю результат, похожий на этот

bahirdar-->mota TOTAL DISTANCE = 100 
bahirdar-->markos-->mota TOTAL DISTANCE = 70 
+0

в SWI см библиотека ([агрегатный] (HTTP: //www.swi-prolog .org/pldoc/человек? раздел = складочный)). Тогда вы можете «?» - заполнить (min (L, Path), Origin^Destination^Path^path (Origin, Destination, Path, L), Length) .' – CapelliC

ответ

1

Используя aggregate библиотеку как CappelliC предлагает будет работать, если вы хотите, чтобы найти наименьшее расстояние между любыми двумя пунктами в базе данных (в соответствии с предикатом путь/4). Если вы хотите найти кратчайший путь, который пользователь вводит в вашу программу, вам нужно будет сохранить эту информацию. Простой способ заключается в asserta ответы на пользователя:

:- dynamic user_path/2. 

option(2):- 
    write('Enter place of origin: '), read(Origin), 
    write('Enter place of destination: '), read(Destination), 
    path(Origin, Destination, Path, Length), 
    asserta(user_path(Origin, Destination)), 
    nl,nl,  
    printPath(Path), write(' '), 
    writef(' TOTAL DISTANCE = %d', [Length]),nl,fail 
; 
    true. 

Тогда вы можете найти минимальный путь с

min_path(Path) :- 
aggregate(
      min(L,Path), 
      Origin^Destination^Path^(
      user_path(Origin, Destination), 
      path(Origin, Destination, Path, L) 
      ), 
      Length 
     ). 
Смежные вопросы