如何查看Prolog查询的详细顺序(执行)?

如何查看Prolog查询的详细顺序(执行)?,prolog,visualization,visualizer,Prolog,Visualization,Visualizer,假设我有一个Prolog程序: loves(vincent, mia). loves(marcellus, mia). jealous(A, B) :- loves(A, C), loves(B, C). 使用query嫉妒(A,B)。我对Prolog非常陌生,我想知道如何才能看到程序将运行的确切顺序,以及如何执行此查询?我尝试过使用trace,嫉妒(A,B)。命令,但它只给了我: 没有更详细的解决方案吗/ 你看到了吗 当你进入页面时,一定要点击右上角的图标以了解更多信息 享受 第10步(

假设我有一个Prolog程序:

loves(vincent, mia).
loves(marcellus, mia).
jealous(A, B) :- loves(A, C), loves(B, C).
使用query
嫉妒(A,B)。
我对Prolog非常陌生,我想知道如何才能看到程序将运行的确切顺序,以及如何执行此查询?我尝试过使用
trace,嫉妒(A,B)。
命令,但它只给了我:

没有更详细的解决方案吗/

你看到了吗

当你进入页面时,一定要点击右上角的图标以了解更多信息

享受


第10步(共49步)后的屏幕截图

所有步骤后给出的屏幕截图示例


Prolog Visualizer使用一种稍微不标准的方式来输入查询,方法是以问号(?)结束查询,例如:

如果您在左侧的输入区域中发布查询,您将收到一个错误,例如:

示例中Prolog可视化工具的输入为

loves(vincent, mia).
loves(marcellus, mia).
jealous(A, B) :- loves(A, C), loves(B, C).
jealous(A,B)?
当Prolog Visualizer完成您的示例时,请注意右边绿色的四个结果


如果您正在使用并且在理解并编写更高级的代码后,您会发现这一点非常有用:



有关其他有用的Prolog参考,请参见:

如果Prolog系统具有callable_property/2和sys_rule/3,则可以编写代码
智能“Unified”端口如下所示,显示大多数通用的Unifier(mgu`):

没有必要回顾性地修改mgu,因为a的解决方案
Prolog查询是mgu的顺序组合。下面是一个运行示例:

?- ?- jealous(A,B).
[A_0 = X_1, B_0 = Y_1]
    [H_1 = mia, X_1 = vincent]
    [Y_1 = vincent]
A = vincent,
B = vincent ;
    [Y_1 = marcellus]
A = vincent,
B = marcellus ;
Etc..
这是Jekejeke Prolog 1.5.0新版本的预览 谓词sys_rule/3,其灵感来自于新的 SWI Prolog的谓词,但保留 子句/2 head和body的参数,并使用谓词
指示器。

这正是我需要的,非常感谢!)@不客气。真正的感谢应该是代码的作者,他有一个链接让我找到了代码。
:- op(1200, fx, ?-).

% 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(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, 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).

% triage(+Assoc, +Assoc, -Assoc, -Assoc)
triage([V=T|L], M, R, [V=T|S]) :- var(T), once((member(W=U, M), U==T)), W==V, !,
   triage(L, M, R, S).
triage([V=T|L], M, [V=T|R], S) :-
   triage(L, M, R, S).
triage([], _, [], []).

% shift(+Assoc, +Atom, -Assoc)
shift([V=T|L], N, [W=T|R]) :-
   atom_concat(V, N, W),
   shift(L, N, R).
shift([], _, []).

% offset(+Integer)
offset(1) :- !.
offset(N) :- write('\t'), M is N-1, offset(M).

% ?- Goal
(?- G) :-
   callable_property(G, sys_variable_names(N)),
   shift(N, '_0', M),
   solve(G, M, 1, _).
?- ?- jealous(A,B).
[A_0 = X_1, B_0 = Y_1]
    [H_1 = mia, X_1 = vincent]
    [Y_1 = vincent]
A = vincent,
B = vincent ;
    [Y_1 = marcellus]
A = vincent,
B = marcellus ;
Etc..