要在Prolog中统一,我们写道:
match(X, Y) :-
X=Y.
如果X = Y,则不是匹配(X,Y)。如果X的每个元素都是Y的相应元素的子集或超集,我希望它成功。
这是我的包含代码:
:- op(400, yfx, <<<).
subset(X, X).
subset(X, Y) :-
X <<< Y.
subset(X, Z) :-
X <<< Y,
subset(Y, Z).
更新:
在我的代码中,我有这些假设的事实:
man <<< human.
human <<< animal.
animal <<< living.
我需要的是更改上面的匹配代码,如下所示:
如果我有:
[living, X] ==> [mortal, X].
和
[man, socrates].
我希望能够证明:
?- mortal(socrates).
yes.
男人和生活之间存在匹配,因为这里的男人是生活的子集。
答案 0 :(得分:2)
有一个执行该检查的ISO谓词subsumes_term。 试试
1 ?- subsumes_term(X,1).
true.
2 ?- subsumes_term(1,X).
false.
要应用于所有列表元素,请使用maplist / 3
maplist(subsumes_term, L1, L2)
答案 1 :(得分:0)
subset([],[]).
subset([H|T],[X|Y]) :- (sublist(H,X); sublist(X,H)), subset(T,Y).
| ?- subset([[1,2],[3,4]],[[1],[3]]).
true ? ;
| ?- subset([[1,2],[3,4]],[[1,2,3],[3]]).
true ? ;
您可以将子列表定义为:
pe([],[]).
pe([H|T],T).
sublist([H|T],[H]).
sublist([H|T],[H|X]) :- sublist(T,X).
sublist([H|T],[X|Y]) :- X \= H, pe([H|T],L), sublist(L,[X|Y]).