簡體   English   中英

打印列表列表,Prolog

[英]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).

使用

定句語法是處理輸入/輸出的一種通用邏輯方法。

首先,請閱讀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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM