[英]How add finitely failed branches to a Prolog visualizer?
關於否定失敗的好處是,為否定失敗編寫元解釋器比為 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.