我得到了这个网格:
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.
你帮我找错了吗?
或者使代码更易于使用的一些提示。
答案 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)
使用dcg!
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