我的答案是用SWI-Prolog編寫的,關於我提到的任何內置謂詞的詳細信息可以在searching the documentation之前得到。不過,我認爲我所說的一切都適用於其他着名的Prolog實現。如果我錯了,請糾正我。
在Prolog,我們與謂詞而不是功能,(或者,我們只使用返回真值函數)的工作。我將使用以下謂語是指你的例子列表我的Prolog的查詢:
ex([ [005,"Chester",100],[001,"Bob",99],[002,"Andy",77] ]).
對於寫作格式的文本到標準輸出流,我們將使用謂詞format/2
。它的簽名是format(+Format, :Arguments)
,其中Format
是一個包含特殊序列以促進插值的原子。換碼序列以代字號開頭,~
,完整菜單可以在SWI-Prolo documentation on format/2
中找到。 Arguments
是用於替換Format
中的序列的序言術語列表。在這個例子中,我們只需要~w
,它寫入一個參數並且~n
寫入一個換行符。作爲一個普通的例子:例如,
?- format('Write ~w, then ~w, followed by ~w~n~n', ['this', 'that', 'the other']).
Write this, then that, followed by the other
true.
你代表的是一個人的形式[ID, Name, Grade
]的列表,所以我們只需要編寫一個斷言,這將讓我們在「No.N」添加N
,然後我們可以使用人次列表的參數其餘format/2
:
display_person(N, Person) :-
format('No.~w: ID="~w", Name="~w", Grade=~w~n', [N|Person]).
在format/2
第二個參數,N
前綴作爲參數列表的頭部。我們可以這樣測試謂詞:
?- ex([P|Ps]), display_person(1, P).
No.1: ID="5", Name="Chester", Grade=100
P = [5, "Chester", 100],
Ps = [[1, "Bob", 99], [2, "Andy", 77]].
這會照顧顯示每個人的個人列表。現在我們只需要遍歷你的人員列表並顯示每個成員。爲了跟蹤N
對顯示的'N'部分的增加值,我們需要一個兩位謂詞,但是我們只需要一個謂詞來將列表傳遞給顯示謂詞。這個要求導致我們使用使用由輔助謂詞支持的前端謂詞的常見模式:
display_people(People): - display_people(1,People)。%%初始化具有起始值1
display_people調用display_people/2
(_,[])。 display_people(N,[人|人物]): - display_person(N,人), M爲N + 1, display_people(M,人)。
運行使用列表中的測試從ex/1
:
?- ex(Ps), display_people(Ps).
No.1: ID="5", Name="Chester", Grade=100
No.2: ID="1", Name="Bob", Grade=99
No.3: ID="2", Name="Andy", Grade=77
Ps = [[5, "Chester", 100], [1, "Bob", 99], [2, "Andy", 77]] ;
false.
然而圖案p([X|Xs]) :- q(X), p(Xs)
只是maplist/n
謂詞是什麼,所以我們可以拯救自己有點打字的,可以說是做聲明的含義該方案通過寫更清楚以下內容:
display_people(People) :-
length(People, NumPeople),
numlist(1, NumPeople, Nums),
maplist(display_person, Nums, People).
numlist(Low, High, Nums)
返回一個列表,Nums
,從Low
到值。在前述定義中,maplist(display_person, Nums, People)
將基本上調用display_person(N, P)
用於Nums
P
和每對N
在People
。
這是一個非常好的小解決方案。 –
這是一個非常不錯的小解決方案':)' –
謝謝。我不得不改變〜〜以便它能夠在unix中使用我的字符串。在swi-prolog上它完美運行。猜這是因爲我的字符串存儲在單引號? – GeorgeCostanza