List 检查两个元素之间的统一是否为真

List 检查两个元素之间的统一是否为真,list,prolog,List,Prolog,所以我的问题是,我有一个相等的谓词(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, P2

所以我的问题是,我有一个相等的谓词(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.
正如你们所看到的,取代基是好的,就像我希望那些取代基发生,但我不希望它们作为输出,我想要的是这是真的还是假的,在这种情况下是真的

正确输出:

?- 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库)来实现这一点

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 .
这基本上就是您想要的功能。您可以将其放入助手规则中,使事情变得更简单。以下内容将为事实中
equal/2
的每个有效关系提供
true

isEqual(X, Y) :-
    {}/equal(X, Y).
如果您只想知道事实中是否存在
equal/2
的一个或多个有效关系,那么您可以添加一个cut

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.

不客气。如果回答了您的问题,请接受此回复。干杯