Porting algorithm from swi prolog to Prolog.net

May 25, 2011 at 9:46 AM

Hi, I''ve got an algorithm written in swi prolog, working; wen I try to execute the algorithm in prolog.net it always fails, so I have some question: how could I retrieve errore messages form prolog compiler? How could use the "trace" in prolog.net? It is so diffrent prolog.net dialet from swi prolog?

 

this is my swi-prolog code:

 

tile(1,y,y,b,r,b,r).
tile(2,r,r,b,y,y,b).
tile(3,b,b,y,y,r,r).
tile(4,b,r,y,b,y,r).
tile(5,b,b,r,y,y,r).
tile(6,y,b,r,y,r,b).
tile(7,b,b,y,r,y,r).
tile(8,b,b,r,y,r,y).
tile(9,r,b,y,r,y,b).
tile(10,y,y,r,b,r,b).
tile(11,r,r,b,y,b,y).
tile(12,r,r,y,b,y,b).
tile(13,b,b,y,r,r,y).
tile(14,b,b,r,r,y,y).
tile(15,g,g,r,y,y,r).
tile(16,g,g,y,r,r,y).
tile(17,y,y,g,r,g,r).
tile(18,y,y,r,g,r,g).
tile(19,r,r,g,y,g,y).
tile(20,r,r,y,g,y,g).
tile(21,g,g,r,r,y,y).
tile(22,r,r,g,y,y,g).
tile(23,g,g,y,y,r,r).
tile(24,g,g,b,r,r,b).
tile(25,b,b,g,g,r,r).
tile(26,b,b,g,r,r,g).
tile(27,r,r,b,g,b,g).
tile(28,b,b,r,r,g,g).
tile(29,r,r,g,b,g,b).
tile(30,b,b,r,g,g,r).
tile(31,g,g,r,y,r,y).
tile(32,g,r,y,g,y,r).
tile(33,g,g,y,r,y,r).
tile(34,r,g,y,r,y,g).
tile(35,y,g,r,y,r,g).
tile(36,g,g,r,b,r,b).
tile(37,b,b,g,r,g,r).
tile(38,b,b,r,g,r,g).
tile(39,g,b,r,g,r,b).
tile(40,b,g,r,b,r,g).
tile(41,g,g,b,r,b,r).
tile(42,r,b,g,r,g,b).
tile(43,b,b,y,y,g,g).
tile(44,y,b,g,y,g,b).
tile(45,b,b,g,g,y,y).
tile(46,g,g,b,y,b,y).
tile(47,b,b,y,g,g,y).
tile(48,g,g,b,y,y,b).
tile(49,b,b,g,y,y,g).
tile(50,b,g,y,b,y,g).
tile(51,g,b,y,g,y,b).
tile(52,g,g,y,b,y,b).
tile(53,y,y,g,b,g,b).
tile(54,y,y,b,g,b,g).
tile(55,b,b,g,y,g,y).
tile(56,b,b,y,g,y,g).

%avvio del programma, max 56 pedine, Rotazione rapp la rotazione
%iniziale, tile pedina colore avvia l'estrazione dei dati dal db e
%tantrix avvia l'elaborazione per allineare le pedine secondo la regola
%aurea.
%Pedina e Rotazione finiscono in 2 liste che rispettivamente contengono
%il numero della pedina e la rotazione associata
%cos� da poter mostra la soluzione del domino successivamente.
%Mancano � un contatore per fermare l'esecuzione, indica le
%pedine che mancano alla fine
%Pedina rappresenta id iniziale delle pedine e Colore il colore
%richiesto per l'inizio della sequenza (faccia alto dx)
tantrix_d(Pezzi) :- Pezzi<57, Mancano is Pezzi-1, Rotazione is 0,  tile(Pedina,Colore,_,_,_,_,_), domino(Colore,Mancano,[Pedina],[Rotazione]).


%qui termina la ricorsione, mancano = 0
%mostro a video la soluzione
domino(_,0,Pedine,Rotazioni) :- mostra_sln(Pedine,Rotazioni). %ribalto prima di stampare????? SOSPESO


%Prima regola della ricorsione,
%Colore � il colore richiesto, Mancano numero di pedine
%che Mancano, Pedine lista con le pedine e Rotazioni sono le rotazioni.
%ColSuccessivo � il prossimo colore da utilizzare per la base
%della regola del domino
%questa regola estrae la pedina non presente che combacia col
%colore richiesto
%
domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,ColSuccessivo,_,_,Colore,_,_),not(presente(ID,Pedine)),Rotazione is 0,Mancano1 is Mancano-1, accoda(Pedine,[ID],Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).

domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,_,_,Colore,_,_,ColSuccessivo),not(presente(ID,Pedine)),Rotazione is 60,Mancano1 is Mancano-1, accoda(Pedine,[ID], Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).

domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,_,Colore,_,_,ColSuccessivo,_),not(presente(ID,Pedine)),Rotazione is 120,Mancano1 is Mancano-1, accoda(Pedine,[ID],Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).

domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,Colore,_,_,ColSuccessivo,_,_),not(presente(ID,Pedine)),Rotazione is 180,Mancano1 is Mancano-1, accoda(Pedine,[ID],Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).

domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,_,_,ColSuccessivo,_,_,Colore),not(presente(ID,Pedine)),Rotazione is 240,Mancano1 is Mancano-1, accoda(Pedine,[ID], Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).

domino(Colore,Mancano,Pedine,Rotazioni) :- tile(ID,_,ColSuccessivo,_,_,Colore,_),not(presente(ID,Pedine)),Rotazione is 300,Mancano1 is Mancano-1, accoda(Pedine,[ID],Pedine1), accoda(Rotazioni,[Rotazione],Rotazioni1), domino(ColSuccessivo,Mancano1,Pedine1,Rotazioni1).



%------------------Funzioni standard di elaborazione liste

%Accoda il valore alla lista, usato
%per aggiungere pedine e rotazioni
%alle rispettive liste
% accoda(X,L,[X|L]). %NO!!!!!!
%trovo il modo di accodare
% veramente o ribalto prima di stampare. SOSPESO

accoda([], L, L).
accoda([X|L1], L2, [X|L3]) :- accoda(L1, L2, L3).



%Usato per controllare se l'id della pedina che sto
%analizzando � gi� stata usata e quindi presente
%nella lista delle pedine che formano la soluzione
%del domino
presente(ID,[ID|_]).
presente(ID,[_|Ys]) :- presente(ID, Ys).

%Mostra la soluzione a video
%la soluzione � presente nelle 2 liste
%In pratica smonto le liste e le mostro finch� non
%sono vuote
mostra_sln([],[]).
mostra_sln(Pedine,Rotazione) :- smonta(Pedine,Pedine1,IDPedina),smonta(Rotazione,Rotazione1,ValRot),write('id: '),write(IDPedina),tab(2),write('posizione '),write(ValRot),write('�'), nl,mostra_sln(Pedine1,Rotazione1).

%cancella la testa della lista, cos� fermo la stampa
smonta([T|C],C,T).

 

 

and this is my c# code:

Prolog.Program program = new Prolog.Program();

                string path = @"D:\UNI\Languages\domino_dimasi.pl";
                byte[] buffer= new byte[0];
                using (FileStream fs = new FileStream(path, FileMode.Open))
                {
                    buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                }
                string prolog = Encoding.ASCII.GetString(buffer);
                


                
                foreach (CodeSentence codeSentence in Parser.Parse(prolog))
                    program.Add(codeSentence);

                ExecutionResults risultato = ExecutionResults.None;

                
                foreach (CodeSentence codeSentence in Parser.Parse(":-tantrix_d(8)."))
                {
                    PrologMachine machine = PrologMachine.Create(program, new Query(codeSentence));
                    machine.ExecutionComplete += new EventHandler<PrologQueryEventArgs>(machine_ExecutionComplete);
                    machine.ExecutionSuspended += new EventHandler(machine_ExecutionSuspended);
                    risultato = machine.RunToBacktrack();
                    if (risultato == ExecutionResults.Success)
                    {
                        foreach (PrologVariable v in machine.QueryResults.Variables)
                            Console.WriteLine(v);
                    }
                    else
                    {
                        Console.WriteLine("FAIL!!!!!!!! ");                      
                    }
                }
            }
            catch (Exception s)
            {
                Console.WriteLine(s.Message);
            }


            Console.ReadLine();

 

 

Thanks.

Alex

May 25, 2011 at 2:47 PM

I've find the error: I use the "write('id: ')" statement, that display a string as output, how I can translate it for using with prolog.net?

Coordinator
Dec 11, 2011 at 7:19 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.