程序仅X = adam因为您插入了剪辑而返回!。当您找到正确的规则并且您不需要做进一步的评估时使用切割,但它会切割所有其他解决方案。
在你的情况下
num_parent(adam, X) :- !, X = 0.
num_parent(eve, X) :- !, X = 0.
num_parent(_, 2). %replaced num_parent(X, 2) with num_parent(_, 2) to avoid singleton variable
num_parent(X, 0)只返回X = adam。
如果你写
num_parent(adam, X) :- X = 0.
num_parent(eve, X) :- !, X = 0.
num_parent(_, 2).
解决方案是X = adamand X = eve,在这种情况下:
num_parent(adam, X) :- X = 0.
num_parent(eve, X) :- X = 0.
num_parent(_, 2).
解决方案将是X = adam,X = eve并且false因为查询num_parent(X, 0)不与num_parent(_, 2).
您可以使用跟踪器更好地查看此行为。