0

我正在通过 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).

给出此代码给出的排序结果。

  1. =6+4:-p(U,U,V), write('Test1: ',U,'',V),nl,失败。

X|U(X 变成了 U)我必须转换所有变量吗?

Y|V(Y 变成了 V)

  1. =7+1:- write('Test1: ',a,' ',b) ,nl,失败。

U|a (U 变成了 a)

V|b(V变成了b)

  1. =:-nl,失败。

  2. =:-失败。

所以我必须达到最后一个没有错的命题,也就是说,在 7 处使用 3,因为 2 似乎在那里用 a 和 c 代替 X 不起作用。

  1. =7+3:-写 ('Test1: ', c,' ',c) ,nl,fail.

U|c

V|c

  1. =:-nl,失败。

  2. =:-失败。

至于没有以下不会失败的命题,我必须去5。

  1. =5+1:-p(U,V,V),write('Test2: ', U,' ',V),nl,失败。

U|a

V|c

  1. =14+2:- write('Test2: ', a,' ',c) ,nl,失败。

  2. =:-nl,失败。

  3. =:-失败。

  4. =14+3:- write('Test2: ', c,' ',c) ,nl,失败。

  5. ...转到一个空子句...

因此我应该有

测试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 何时被视为结束?

4

0 回答 0