在PROLOG中写入时不打印变量值

在PROLOG中写入时不打印变量值,prolog,Prolog,我试图在屏幕上打印列表中的元素,但是是以自定义方式打印的。 编译代码时,出现以下情况: 我的代码: printTray([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]) :- nl, printLine(L0), print('---------+---+---+---+---+---+---+---+---+---'), nl, printLine(L1), print('---------+---+---+---+---+-

我试图在屏幕上打印列表中的元素,但是是以自定义方式打印的。 编译代码时,出现以下情况:

我的代码:

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子句中的列表是纸盘的行。所以,对于每一行,我一个接一个地打印元素。 我不知道这是什么原因,我尝试了其他方法,但结果都是一样的。
当我将列表元素的值更改为变量值时,就会出现问题。

也许您只需要将所有write/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 
---------+---+---+---+---+---+---+---+---+---
         |   |   |   |   |   |   |   |   |   
---------+---+---+---+---+---+---+---+---+---
         |   |   |   |   |   |   |   |   |   
---------+---+---+---+---+---+---+---+---+---

也许您只需要将所有write/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 
---------+---+---+---+---+---+---+---+---+---
         |   |   |   |   |   |   |   |   |   
---------+---+---+---+---+---+---+---+---+---
         |   |   |   |   |   |   |   |   |   
---------+---+---+---+---+---+---+---+---+---

调用打印托盘的代码在哪里?您是否尝试过使用或任何其他方法来确定变量未绑定的原因?您的变量都未绑定;您是如何使用这些关系的?您听说过迭代吗?它将为您节省大量的复制粘贴。调用
printTray
的代码在哪里?您是否尝试过使用或任何其他方法来确定变量未绑定的原因?您的变量都未绑定;您是如何使用这些关系的?您听说过迭代吗?它将为您节省大量的复制粘贴。