检查两个元素之间的统一性是对还是错

问题描述 投票:0回答:1

所以我的问题是,我有这个谓词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).
list prolog swi-prolog
1个回答
0
投票

您可以使用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.

© www.soinside.com 2019 - 2024. All rights reserved.