所以我的问题是,我有这个谓词equal(X,Y),它基本上说X等于Y,并且只要它们具有相同的长度,就统一它们,但是我想要的是谓词给出对还是错,但是相反,它给了我统一性。
如果有人可以帮助我会非常感激。
我的输出:
?- equal([[d, r, a, m, a],[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).P11 = d,
P21 = r,
P31 = P51, P51 = a,
P41 = P23, P23 = m,
P33 = e,
P43 = n,
P53 = o .
?- equal([[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).
false.
如您所见,替代是很好的,就像我希望发生这些替代,但是我不希望它们作为输出,我想要的是这是True还是False,在这种情况下是True。
正确的输出:
?- equal([[d, r, a, m, a],[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).P11 = d,
true.
?- equal([[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).
false.
程序:
isSubset([],_).
isSubset([H|T],Y):-
member(H,Y),
select(H,Y,Z),
isSubset(T,Z).
equal(X,Y):-
isSubset(X,Y),
isSubset(Y,X).
您可以使用Lambda表达式(例如,使用SWI-Prolog的yall库来实现)。
Prolog仅对在查询之前位于{ }
中的那些变量产生绑定:
?- {P11, P21}/equal([[d, r, a, m, a],[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).
P11 = d,
P21 = r .
但是请注意,您也可以将方括号留空并且不产生任何绑定:
?- {}/equal([[d, r, a, m, a],[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]).
true .
这似乎实质上是您想要的功能。您可以将其放入帮助规则中,以使事情变得容易。下面将为您提供true
在事实中的每个有效关系的equal/2
:
isEqual(X, Y) :-
{}/equal(X, Y).
如果您仅想知道事实中是否存在equal/2
的有效关系[[一个或多个,则可以添加剪切!
:
isEqual(X, Y) :-
{}/equal(X, Y),
!.
因此,您的查询输出是:
?- isEqual([[d, r, a, m, a],[a, m, e, n, o]],[[P11, P21, P31, P41, P51], [a, P23, P33, P43, P53]]). true.