我正在為明天的AI考試做準備,我被一個特別的Prolog問題卡住了。
問題如下:
考慮以下程式:
r([], X, X)。
r([X|Y], X2, X3) :-
r(Y, [X|X2], X3)。
跟蹤Prolog如何找到以下查詢的結果:
我們必須手工追蹤,我記得有小部分,我用Prolog寫了這個,得到了答案,但看不到答案來自哪里。 P. S. 我使用了 謝謝大家!?
? - r([1,2,6], [], L).trace運算子,它顯示了我的步驟,但沒有顯示哪些函式被啟動。
uj5u.com熱心網友回復:
如果你按照本節后的概述將跟蹤記錄到一個檔案中,然后在你的代碼中添加行注釋,并將代碼行與跟蹤記錄相關聯,你會得到這樣的結果。
r([1,2,6]/span>, []/span>, L) % 目標
r([], X, X) 。 % 行 1
r([X|Y], X2, X3) :- % 行 2。
r(Y, [X|X2], X3)。 %行3
呼叫。 (11) r([1, 2, 6] 。 [] , _32640 ) % Goal
統一。 (11) r([1, 2, 6] 。 [] , _32640 ) % Line: 2
呼叫。 (12) r([2, 6] , [1] , _32640 ) % Line: 3
統一。 (12) r([2, 6] 。 [1] , _32640 ) % Line: 2
呼叫。 (13) r([6] ,/span> [2。1] , _32640 ) % Line: 3
統一。 (13) r([6] ,/span> [2, 1] , _32640 ) % Line: 2
呼叫。 (14) r([] , [6, 2, 1], _32640 ) % Line: 3
統一。 (14) r([]/span> 。 [6, 2, 1]。 [6, 2, 1]) % Line: 1
Exit: (14) r([]/span> 。 [6, 2, 1]。 [6, 2, 1]) % Line: 1
Exit: (13) r([6] , [2, 1] 。 [6, 2, 1]) % Line: 3
Exit: (12) r([2, 6] , [1] , [6, 2, 1]) % Line: 3
Exit: (11) r([1, 2, 6] 。 [] , [6, 2, 1]) % 線。 3
使用protocol/0來捕獲跟蹤到一個檔案。
檔案:examples.pl
:- module(examples,
[
example/1
]).
r([], X, X) 。
r([X|Y], X2, X3) :-
r(Y, [X|X2], X3) 。
example(1) :-
r([1,2,6], [], L) 。
format('~w~n',[L] )。
示例運行
Welcome to SWI-Prolog (threaded, 64 bits, version8. 3.28-20g6f8a68f2b)
SWI-Prolog是絕對沒有保證的。這是免費軟體。
請運行?- license.以獲得法律細節。
對于在線幫助和背景,請訪問https://www.swi-prolog.org。
對于內置幫助,請使用?- help(Topic)。 或?- apropos(Word)。
?- working_directory(_,'C:/Users/Groot')。
真實的。
?-[實體]。
true.
?- set_prolog_flag(color_term,false)。
真。
?- leash(-all), visible( all) 。
真。
?- protocol("./trace_output.txt") 。
true.
?-跟蹤。
真正的。
[trace] ?- example(1)。
呼叫。(10) 示例:example(1)
統一了。(10) examples:example(1)
呼叫。(11) examples:r([1, 2, 6], [], _32640)
統一。(11) 示例:r([1, 2, 6], [], _32640)
呼叫。(12) 示例:r([2, 6], [1], _32640)
統一。(12) 示例:r([2, 6], [1], _32640)
呼叫。(13) 示例:r([6], [2, 1], _32640)
統一。(13) 示例:r([6], [2, 1], _32640)
呼叫。(14) 示例:r([], [6, 2, 1], _32640)
統一。(14) 示例。 r([], [6, 2, 1], [6, 2, 1])
退出。(14) 示例。 r([], [6, 2, 1], [6, 2, 1])
退出。(13) 示例。 r([6], [2, 1], [6, 2, 1])
退出。(12) 示例。 r([2, 6], [1], [6, 2, 1])
退出。(11) 示例。 r([1, 2, 6], [], [6, 2, 1] )
^ 呼叫。(11) format('~w~n'。[[6, 2, 1]] )
[6,2,1]
^ 退出。(11) format('~w~n'。[[6, 2, 1]] )
退出。(10) examples:example(1)
真實。
[trace] ? - nodebug。
true.
?-noprotocol。
true。
檔案:trace_output.txt
true.
?-跟蹤。
true。
[trace] ?- example(1) 。
呼叫。(10) examples:example(1)
統一了。(10) examples:example(1)
呼叫。(11) examples:r([1, 2, 6], [], _32640)
統一。(11) 示例:r([1, 2, 6], [], _32640)
呼叫。(12) 示例:r([2, 6], [1], _32640)
統一。(12) 示例:r([2, 6], [1], _32640)
呼叫。(13) 示例:r([6], [2, 1], _32640)
統一。(13) 示例:r([6], [2, 1], _32640)
呼叫。(14) 示例:r([], [6, 2, 1], _32640)
統一。(14) 示例。 r([], [6, 2, 1], [6, 2, 1])
退出。(14) 示例。 r([], [6, 2, 1], [6, 2, 1])
退出。(13) 示例。 r([6], [2, 1], [6, 2, 1])
退出。(12) 示例。 r([2, 6], [1], [6, 2, 1])
退出。(11) 示例。 r([1, 2, 6], [], [6, 2, 1] )
^ 呼叫。(11) format('~w~n'。[[6, 2, 1]] )
[6,2,1]
^ 退出。(11) format('~w~n'。[[6, 2, 1]] )
退出。(10) examples:example(1)
真實。
[trace] ? - nodebug。
true.
?-noprotocol。
uj5u.com熱心網友回復:
如果你使用SWI prolog tracer,你可以一步一步地執行你的程式,它將顯示你當前的目標和回溯(類似于呼叫堆疊),如果要求的話。
只要發出一個trace.,然后呼叫你的目標r([1,2,6], [], L)。
你可以通過按Enter一步一步地跟蹤目標的執行,并通過按g
來列印當前的回溯。你也可以使用圖形跟蹤器,發布gtrace.,而不是trace.。使用圖形追蹤器可以讓你看到呼叫堆疊和每一幀的變數系結。
要結束跟蹤,你可以呼叫nodebug.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316552.html
標籤:
上一篇:如何除錯和檢查一個遞回函式?
