我正在通过 Prolog 学习逻辑,我想知道如何管理 Prolog 分辨率。
让我们成为以下 Prolog 程序:
1. p(a,a,b).
2. p(a,c,c).
3. p(c,c,c).
4. r(X,Y):- p(X,X,Y),write('Test1: ',X,' ',Y),nl,fail.
5. r(X,Y):- p(X,Y,Y),write('Test2: ', X, ' ',Y),nl.
6. go:-r(U,V).
给出此代码给出的排序结果。
- =6+4:-p(U,U,V), write('Test1: ',U,'',V),nl,失败。
X|U(X 变成了 U)我必须转换所有变量吗?
Y|V(Y 变成了 V)
- =7+1:- write('Test1: ',a,' ',b) ,nl,失败。
U|a (U 变成了 a)
V|b(V变成了b)
=:-nl,失败。
=:-失败。
所以我必须达到最后一个没有错的命题,也就是说,在 7 处使用 3,因为 2 似乎在那里用 a 和 c 代替 X 不起作用。
- =7+3:-写 ('Test1: ', c,' ',c) ,nl,fail.
U|c
V|c
=:-nl,失败。
=:-失败。
至于没有以下不会失败的命题,我必须去5。
- =5+1:-p(U,V,V),write('Test2: ', U,' ',V),nl,失败。
U|a
V|c
=14+2:- write('Test2: ', a,' ',c) ,nl,失败。
=:-nl,失败。
=:-失败。
=14+3:- write('Test2: ', c,' ',c) ,nl,失败。
...转到一个空子句...
因此我应该有
测试1:ab
测试1:ab
测试2:交流
测试2:抄送
但是,我在 SWISH 上有一个错误:
procedure ` (A:-B)' does not exist
Reachable from:
swish_trace:swish_call( (go:-r(A,B)))
'$swish wrapper'((go:-r(A,B)),C)
因此,您能帮我理解如何手动运行 Prolog 程序并在编译器上验证它吗?此外,在执行 X|U(X 已变为 U)时,我是否必须转换所有变量?最后,Prolog 何时被视为结束?