考虑:
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|_]).
考虑:
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|_]).
首先,考虑 的含义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|_]).
将 5 与第一个 Z 统一,将第二个 Z 与 Y 统一,以获得单一解决方案bar([_,Y], [5,5], [Z,Z,Z|_]).
将 Y 与第二个 Z 统一,将第三个 Z 与 5 统一为一个解。