1- 首先在checkX 它收集XList 中的所有X。
2- 在checkX1 中,对于每个 X,它在 YList 中收集它的 Y。
3- 最后在checkX2 中,使用same 谓词检查每个X 的Y 是否相同。
value(a,b).
value(d,f).
value(a,k).
checkX:-
findall(X1,value(X1,_),XList),
checkX1(XList,YList),
checkX2(XList,YList).
checkX1([],[]).
checkX1([H|T],[YList|List]):-
findall(Y,value(H,Y),YList),
checkX1(T,List).
checkX2([],[]).
checkX2([H|T],[H2|T2]):-
(
\+same(H2)->
write('X='),
write(H),
write(' '),
write('Y='),
writeln(H2),
writeln('true'),
checkX2(T,T2);
write('X='),
write(H),
write(' '),
write('Y='),
writeln(H2),
writeln('false'),
checkX2(T,T2)).
same([]). % You only need this one if you want the empty list to succeed
same([_]).
same([X,X|T]) :- same([X|T]).
示例:
?-checkX
X=a Y=[b, k]
true
X=d Y=[f]
false
X=a Y=[b, k]
true
1true
这是我的方法:
1-定义事实。
2- checkX 谓词使用 findall 查找 X 的所有 Y 值。它返回一个列表(YList=[b,k])。
3-然后检查列表中的元素是否不相同,使用(\+)表示不同。
value(a,b).
value(d,f).
value(a,k).
checkX(X):-
findall(Y,value(X,Y),YList),
\+same(YList).
same([]). % You only need this one if you want the empty list to succeed
same([_]).
same([X,X|T]) :- same([X|T]).
示例:
?-checkX(a).
1true
现在假设我有以下事实:
value(a,k).
value(d,f).
value(a,k).
?-checkX(a).
false