如何在prolog列表中定义排序

时间:2014-01-30 15:06:21

标签: prolog

要在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.

男人和生活之间存在匹配,因为这里的男人是生活的子集。

2 个答案:

答案 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]).