This project is read-only.
1
Vote

Porting algorithm from swi prolog to Prolog.net

description

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 &#43;= new EventHandler<PrologQueryEventArgs>(machine_ExecutionComplete);
                machine.ExecutionSuspended &#43;= 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

comments