簡體   English   中英

如何將有限失敗的分支添加到 Prolog 可視化工具?

[英]How add finitely failed branches to a Prolog visualizer?

假設我們想要可視化這個 Prolog 執行。 沒有來自 fidschi 島的目標,也沒有其他異國情調的假設,只有具有默認選擇規則的舊SLDNF

p(a).
p(b).

?- \+ p(c).
Yes

但是我們只有一個 Prolog 可視化器,它可以將推導顯示為失敗而不會否定,就像這里一樣。 我們如何提升 Prolog 可視化器以將否定顯示為失敗?

關於否定失敗的好處是,為否定失敗編寫元解釋器比為 cut (.) 編寫元解釋器要容易得多:所以基本上 SLDNF 的普通解釋器可以通過插入一個 SLD 的普通解釋器派生附加規則:

solve(true) :- !.
solve((A,B)) :- !, solve(A), solve(B).
solve((\+ A)) :- !, \+ solve(A). /* new */
solve(H) :- functor(H, F, A), sys_rule(F/A, H, B), solve(B).

我們現在可以打開 go 並從這里擴展solve/3,同樣徒勞。 但是我們做的更多,我們還在搜索樹中寫出了失敗的分支,類似於 Prolog 可視化工具通過刪除子句進行的操作。 所以修改后的solve/3如下:

% solve(+Goal, +Assoc, +Integer, -Assoc)
solve(true, L, _, L) :- !.
solve((A, B), L, P, R) :- !, solve(A, L, P, H), solve(B, H, P, R).
solve((\+ A), L, P, L) :- !, \+ solve(A, L, P, _). /* new */
solve(H, L, P, R) :- functor(H, F, A), sys_rule(F/A, J, B),
   callable_property(J, sys_variable_names(N)),
   number_codes(P, U), atom_codes(V, [0'_|U]), shift(N, V, W),
   append(L, W, M), 
   (H = J -> true; offset(P), write(fail), nl, fail),  /* new */
   reverse(M, Z), triage(M, Z, I, K),
   offset(P), write_term(I, [variable_names(Z)]), nl,
   O is P+1, solve(B, K, O, R).

這是一個示例運行:

?- ?- \+ p(c).
fail
fail
Yes

也可以看看:

人工智能算法、數據結構和習語
CH6:三個元解釋器
Georg F. Luger - Addison-Wesley 2009
https://www.cs.unm.edu/~luger/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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