2014-01-30 2 views
0

Для объединения в Прологе, мы пишем:Как определить subsumptions в Prolog списках

match(X, Y) :- 
    X=Y. 

Вместо сопоставления (X, Y) следующего, если X = Y. Я хотел бы, чтобы добиться успеха, если каждый из элементов Х представляет собой подмножество или надмножество соответствующего элемента Y.

Это мой код категоризации:

:- op(400, yfx, <<<). 

subset(X, X). 
subset(X, Y) :- 
    X <<< Y. 
subset(X, Z) :- 
    X <<< Y, 
    subset(Y, Z). 

ОБНОВЛЕНИЕ:

В моем коде, у меня есть эти факты subsumptions:

man <<< human. 
human <<< animal. 
animal <<< living. 

, что мне нужно будет изменить код соответствия выше работать следующим образом:

Если у меня есть:

[living, X] ==> [mortal, X]. 

и

[man, socrates]. 

Я хотел бы быть в состоянии доказать:

?- mortal(socrates). 
yes. 

Существует совпадение между человеком и живым, поскольку человек здесь является подмножеством жизни.

+0

ли эти простые списки, или соединений (список в список) списки? И если последнее, что представляет собой подмножество? Другими словами, будет ли 'A' рассматриваться как подмножество' B', если вы сглаживаете оба из них, а 'a flattened' является подмножеством' B flattened'? – lurker

+0

Ваш вопрос может означать много чего. Кажется, вы хотите определить свой собственный язык, но вы больше не оставляете его. Например. в чем разница между «<<<' and '==>». Кажется, что они служат аналогичной цели. – false

+0

В моем примере я подразумеваю под (<<<) подмножество, например: man <<< human. И я подразумеваю под (==>). A ==> B. – aamls

ответ

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]). 
+0

Как мы можем определить подписок здесь? – aamls

+0

'sublist' - встроенный предикат. – Ankur

+0

Это то, что у меня есть: ! Ошибка существования пользователя: подсписок/2 ! процедура пользователь: подсписок/2 не существует ! Цель: user: sublist ([1,2], [1]) – aamls

2

есть предикат ISO subsumes_term, который выполняет эту проверку. Попробуйте

1 ?- subsumes_term(X,1). 
true. 

2 ?- subsumes_term(1,X). 
false. 

Чтобы применить ко всем спискам элементов, используйте MapList/3

maplist(subsumes_term, L1, L2) 
Смежные вопросы