2016-03-09 3 views
1

Я пытаюсь использовать Пролог, чтобы найти сумму пути, используя рекурсию. Мне нужно передать список узлов графа, а затем вернуть сумму их весов.Рекурсивно найти сумму в прологе

Это то, что я пробовал, но не уверен, что я на правильном пути.

connect(a,b,5). 
connect(b,c,8). 
connect(a,d,10). 
connect(d,e,6). 
connect(d,f,11). 
connect(d,g,4). 
connect(b,d,2). 
connect(b,e,9). 
connect(c,d,4). 
connect(c,f,5). 
connect(e,g,2). 
connect(f,g,1). 

list_sum([], 0). 
list_sum([Head | Tail], TotalSum) :-  
    list_sum(connect(Head,Tail,X), Sum1), 
    TotalSum is Head + Sum1. 

Пример Цель:

list_sum([a,b,c],Sum). 
Sum = 13 
+0

Ваш следующий вопрос предполагает, что вы ответили на этот вопрос самостоятельно. Вы можете либо удалить этот вопрос, либо добавить свой ответ на него. –

+1

Это тесно связано с этим вопросом: [Как суммировать несколько результатов из предиката в Prolog] (http://stackoverflow.com/questions/35867950/how-to-sum-multiple-results-from-a-predicate-in -prolog). – lurker

ответ

1

Я вижу три проблемы с кодом. Во-первых, у вас есть логическая переменная X, которую вы не используете, во-вторых, ваш предикат list_sum принимает список в качестве своего первого элемента, и все же вы даете ему предикатconnect(Head,Tail,X), третий - то, что вы используя Head в дополнении, тогда как, по-видимому, Head является атомом, а не Integer (возможно, вы имели в виду X здесь), четвертый (я нахожу их, как я иду), состоит в том, что второй аргумент соединения предиката является атомом (представляющий собой узел, в данном случае), и вы даете ему список.

И пятая проблема с вопросом: Вы, кажется, думает, что вес на узлах, где они явно на краях.

Так что я думаю, что вопрос о вашем назначении два-сгибы:

  1. Проверьте, что путь дается вам на самом деле путь (в том, что существует связь между каждым элементом и следующим)
  2. Если это действительно путь, суммируйте веса ваших соединений на этом пути.

В Прологе, основной артефакт программирования являются предикаты, не функции. Таким образом, чтобы получить вес данной ссылки, вы вызываете connect(Head,NextNode, Weight), что дает вам (посредством объединения) как вес, так и возможный NextNode, тогда рекурсивный вызов будет проверять, является ли этот NextNode действительно следующим элементом в списке. После рекурсивного вызова вы используете Weight вместо Head, и он должен быть немного ближе к решению.

PS: Не стесняйтесь создавать list_sum_aux/3 и использовать его вместо этого.

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