How to find shortest path in prolog with weighted graph











up vote
0
down vote

favorite












I have this code :



link(a,b,4). 
link(a,c,2).
link(b,g,5).
link(c,g,6).
link(c,d,5).
link(d,g,3).

path(S,D,TDist):-
link(S,D,TDist).
path(S,D,TDist):-
link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.


This will follow a depth first search strategy, but the result is that it will give me all the paths, and it won't show which is the shortest. Is it possible to still use that strategy and find the shortest path? if not, what search strategy to use? and how can I implement it.










share|improve this question




























    up vote
    0
    down vote

    favorite












    I have this code :



    link(a,b,4). 
    link(a,c,2).
    link(b,g,5).
    link(c,g,6).
    link(c,d,5).
    link(d,g,3).

    path(S,D,TDist):-
    link(S,D,TDist).
    path(S,D,TDist):-
    link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.


    This will follow a depth first search strategy, but the result is that it will give me all the paths, and it won't show which is the shortest. Is it possible to still use that strategy and find the shortest path? if not, what search strategy to use? and how can I implement it.










    share|improve this question


























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have this code :



      link(a,b,4). 
      link(a,c,2).
      link(b,g,5).
      link(c,g,6).
      link(c,d,5).
      link(d,g,3).

      path(S,D,TDist):-
      link(S,D,TDist).
      path(S,D,TDist):-
      link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.


      This will follow a depth first search strategy, but the result is that it will give me all the paths, and it won't show which is the shortest. Is it possible to still use that strategy and find the shortest path? if not, what search strategy to use? and how can I implement it.










      share|improve this question















      I have this code :



      link(a,b,4). 
      link(a,c,2).
      link(b,g,5).
      link(c,g,6).
      link(c,d,5).
      link(d,g,3).

      path(S,D,TDist):-
      link(S,D,TDist).
      path(S,D,TDist):-
      link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.


      This will follow a depth first search strategy, but the result is that it will give me all the paths, and it won't show which is the shortest. Is it possible to still use that strategy and find the shortest path? if not, what search strategy to use? and how can I implement it.







      prolog depth-first-search shortest-path uniform-cost-search






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 13 at 0:22









      false

      10.9k769140




      10.9k769140










      asked Nov 10 at 19:08









      sosscs

      362




      362
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I think there are problems with your code:




          • TDist=TD1+TD2 doesn't compute the sum, use is/2 instead, at least when a path is returned.


          • It will loop if the graph contains cycles, but assuming the data actually is a DAG, we can ignore by now.


          • We can't say what the actual path will be, just its value.



          Anyway, library(aggregate) can be used to find the shortest path. For instance



          ?- aggregate(min(D), path(a,g,D), D).
          D = 8.


          Or, since gnu-prolog doesn't have library(aggregate), take the first element computed by setof/3:



          ?- setof(D, path(a,g,D), [Min|Rest]).
          Min = 8,
          Rest = [9, 10].





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53242473%2fhow-to-find-shortest-path-in-prolog-with-weighted-graph%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            I think there are problems with your code:




            • TDist=TD1+TD2 doesn't compute the sum, use is/2 instead, at least when a path is returned.


            • It will loop if the graph contains cycles, but assuming the data actually is a DAG, we can ignore by now.


            • We can't say what the actual path will be, just its value.



            Anyway, library(aggregate) can be used to find the shortest path. For instance



            ?- aggregate(min(D), path(a,g,D), D).
            D = 8.


            Or, since gnu-prolog doesn't have library(aggregate), take the first element computed by setof/3:



            ?- setof(D, path(a,g,D), [Min|Rest]).
            Min = 8,
            Rest = [9, 10].





            share|improve this answer

























              up vote
              0
              down vote













              I think there are problems with your code:




              • TDist=TD1+TD2 doesn't compute the sum, use is/2 instead, at least when a path is returned.


              • It will loop if the graph contains cycles, but assuming the data actually is a DAG, we can ignore by now.


              • We can't say what the actual path will be, just its value.



              Anyway, library(aggregate) can be used to find the shortest path. For instance



              ?- aggregate(min(D), path(a,g,D), D).
              D = 8.


              Or, since gnu-prolog doesn't have library(aggregate), take the first element computed by setof/3:



              ?- setof(D, path(a,g,D), [Min|Rest]).
              Min = 8,
              Rest = [9, 10].





              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                I think there are problems with your code:




                • TDist=TD1+TD2 doesn't compute the sum, use is/2 instead, at least when a path is returned.


                • It will loop if the graph contains cycles, but assuming the data actually is a DAG, we can ignore by now.


                • We can't say what the actual path will be, just its value.



                Anyway, library(aggregate) can be used to find the shortest path. For instance



                ?- aggregate(min(D), path(a,g,D), D).
                D = 8.


                Or, since gnu-prolog doesn't have library(aggregate), take the first element computed by setof/3:



                ?- setof(D, path(a,g,D), [Min|Rest]).
                Min = 8,
                Rest = [9, 10].





                share|improve this answer












                I think there are problems with your code:




                • TDist=TD1+TD2 doesn't compute the sum, use is/2 instead, at least when a path is returned.


                • It will loop if the graph contains cycles, but assuming the data actually is a DAG, we can ignore by now.


                • We can't say what the actual path will be, just its value.



                Anyway, library(aggregate) can be used to find the shortest path. For instance



                ?- aggregate(min(D), path(a,g,D), D).
                D = 8.


                Or, since gnu-prolog doesn't have library(aggregate), take the first element computed by setof/3:



                ?- setof(D, path(a,g,D), [Min|Rest]).
                Min = 8,
                Rest = [9, 10].






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 10 at 19:35









                CapelliC

                50.7k43261




                50.7k43261






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53242473%2fhow-to-find-shortest-path-in-prolog-with-weighted-graph%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Xamarin.iOS Cant Deploy on Iphone

                    Glorious Revolution

                    Dulmage-Mendelsohn matrix decomposition in Python