[英]Print list of lists, 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.
你能幫我發現我的錯誤嗎?
或一些使代碼更易於使用的提示。
您的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).
使用dcg !
定句語法是處理輸入/輸出的一種通用邏輯方法。
首先,請閱讀Markus Triska 精心編寫的DCG入門 ,也稱為SO上的@mat !
現在,作為快速解決方案,請使用內置謂詞format/2
如下所示:
?- X = [a,b,c], format('~s~n',[X]).
abc % output via side-effect
X = [a, b, c]. % query succeeds
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.