对Prolog的反应感到困惑

时间:2013-05-15 03:20:25

标签: prolog

考虑:

bar([], Ws, Ws).
bar([X|Xs], Ys, [X|Zs]) :- bar(Xs, Ys, Zs).

1)这怎么没有解决方案

bar([1,2], [], [X,X]).

2)当Z = 5时,它如何只有一个解?

bar([5,Y], [Y,5], [Z,Z|_]).

3)当Z = 5且Y = 5时,它如何只有一个解?

bar([_,Y], [5,5], [Z,Z,Z|_]).

1 个答案:

答案 0 :(得分:1)

首先,考虑bar/3的含义:规则有三个表示列表的参数。当最后一个列表是前两个列表的串联时,bar/3返回一个解决方案:

bar([1,2,3], [4,5], X)       // X=[1,2,3,4,5]
bar([1,2,3], X, [1,2,3,4,5]) // X=[4,5]
bar(X, [4,5], [1,2,3,4,5])   // X=[1,2,3]

了解这一点,您可以找到所有问题的答案:

  • bar([1,2], [], [X,X]).需要X同时与1和2统一,这是不可能的
  • bar([5,Y], [Y,5], [Z,Z|_]).将第一个Z统一为5,将第二个Z与Y统一,以获得单个解决方案
  • bar([_,Y], [5,5], [Z,Z,Z|_]).将Y与第二个Z统一,第三个Z与5统一,用于单个解决方案。