2017-01-03 62 views
1

我試圖以自定義的方式在屏幕上打印列表的元素。 當我編譯代碼時,出現在這個: print在PROLOG中寫入不會打印變量值

我的代碼:

printTray([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]) :- 
    nl, 
    printLine(L0), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L1), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L2), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L3), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L4), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L5), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L6), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L7), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L8), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L9), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl, 
    printLine(L10), 
    print('---------+---+---+---+---+---+---+---+---+---'), nl. 

printLine([P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10]) :- 
    write(P0), 
    print('  '), 
    write(P1), 
    print(' | '), 
    write(P2), 
    print(' | '), 
    write(P3), 
    print(' | '), 
    write(P4), 
    print(' | '), 
    write(P5), 
    print(' | '), 
    write(P6), 
    print(' | '), 
    write(P7), 
    print(' | '), 
    write(P8), 
    print(' | '), 
    write(P9), 
    print(' | '), 
    write(P10), 
    print(' '), 
    nl. 

的printTray子句中的列表是托盤的行。所以,我爲每一行打印元素一個接一個。 我不知道這個原因,我嘗試了另一種方式,但結果永遠是一樣的。 當我更改變量值的列表元素的值時,會發生問題。

+1

調用'printTray'的代碼在哪裏?您是否嘗試過使用[guitracer](http://www.swi-prolog.org/pldoc/man?predicate=guitracer/0)或其他任何手段來確定變量未綁定的原因? –

+2

您的變量都是未綁定的;你怎麼使用這些關係? –

+0

你有沒有聽說過迭代?這將爲您節省大量的複製粘貼。 –

回答

0

也許你只是需要一個工具來代替所有寫/ 1像

vwrite(V) :- var(V) -> write(' ') ; write(V). 

你的代碼的一些重構將導致

printTray(Tray) :- 
    nl, maplist(printLine, Tray). 

printLine([P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10]) :- 
    vwrite(P0), 
    write('  '), 
    maplist([P]>>(vwrite(P),write(' | ')), [P1,P2,P3,P4,P5,P6,P7,P8,P9]), 
    vwrite(P10), 
    writeln(' '), 
    writeln('---------+---+---+---+---+---+---+---+---+---'). 

vwrite(V) :- var(V) -> write(' ') ; write(V). 

與此測試數據配對

tray([ 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [y,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,1,_,_], 
    [_,_,_,_,_,_,_,_,_,2,_], 
    [_,_,_,_,_,_,_,_,_,_,3], 
    [_,_,_,_,_,_,_,_,_,_,_], 
    [_,_,_,_,_,_,_,_,_,_,_]]). 

收益率

?- tray(T), printTray(T). 

     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
y  | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | 1 | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | 2 | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 3 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+--- 
     | | | | | | | | | 
---------+---+---+---+---+---+---+---+---+---