打印列表清单,Prolog

时间:2015-10-06 11:15:35

标签: list grid prolog

我得到了这个网格:

tab([[s,f,f,f,s,f,f,f,s],
     [f,s,f,f,f,f,f,s,f],
     [f,f,s,f,f,f,s,f,f],
     [f,f,f,f,f,f,f,f,f],
     [s,f,f,f,m,f,f,f,s],
     [f,f,f,f,f,f,f,f,f],
     [f,f,s,f,f,f,s,f,f],
     [f,s,f,f,f,f,f,s,f],
     [s,f,f,f,s,f,f,f,s]]).

我想在屏幕上打印而不带括号和逗号。 顺便说一句,无论有没有,我都可以打印出来。

这些是打印规则:

viewTab([]).
viewTab([H|T]) :-
    printList(H),
    viewTab(T).

printList([]) :-
    nl.
printList([H|T]) :-
    write(H),
    write(' | '),
    printList(T).

我在Prolog的终端中称之为:

?- viewTab(X), tab(X).

我无法打印一个东西,而且我得到一个无限循环:

printList([]) :-
   nl.
你帮我找错了吗?

或者使代码更易于使用的一些提示。

2 个答案:

答案 0 :(得分:3)

你的viewTab/1 不是纯粹的逻辑谓词:它有副作用,如果它的参数是变量,它不会终止。

例如:

?- listing(foo).

foo([]).
foo([_|A]) :-
    foo(A).

true.

?- foo(X).
X = [] ;
X = [_G256] ;
X = [_G256, _G259] ;
X = [_G256, _G259, _G262] ;
X = [_G256, _G259, _G262, _G265] ;
X = [_G256, _G259, _G262, _G265, _G268] . % and so on

所以这个:

?- viewTab(X), tab(X).

X中放置一个列表,然后tab(X)失败,您无限期地回到viewTab(X)

你应该尝试:

?- tab(X), viewTab(X).

答案 1 :(得分:2)

使用

Definite clause grammars是一种处理输入/输出的通用逻辑方法。

首先,请按this well-written DCG primer阅读Markus Triska, also known as @mat on SO

现在,作为快速修复,请使用内置谓词format/2,如下所示:

?- X = [a,b,c], format('~s~n',[X]).
abc                                    % output via side-effect
X = [a, b, c].                         % query succeeds