2015-10-06 98 views
3

我得到這個電網:打印列表,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). 

我把它在序言的終端,如:

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

我不能打印的事情,我在得到一個無限循環:

printList([]) :- 
    nl. 

你能幫我找到我的錯誤嗎?

或者使代碼更易於使用的一些提示。

回答

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). 
+2

OOOOOHHH!是!謝謝你指出! –

2

使用

Definite clause grammars是處理輸入/輸出的通用邏輯方式。

首先,請通過Markus Triska, also known as @mat on SO閱讀this well-written DCG primer


眼下,作爲速戰速決,使用內置的謂詞format/2這樣的:

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

除非所有元素都是「字符」(單字母原子) – 2015-10-09 08:20:32

+1

@Boris,否則「格式」將不起作用。對!但是,這對於快速修復來說是一個嚴格的限制嗎?代碼是* so * passe ... – repeat

+0

我實際上很喜歡它,如果'format'可以只是將一個條目列表打印出來,就好像_each_條目已經傳遞給'write'一樣。目前不可能。 – 2015-10-09 11:21:57