2013-04-03 3 views
1

Я реализую некоторые из встроенных функций пролога как практика. Тем не менее, я столкнулся с трудностями в пересечении и различии, потому что в моем рекурсивном случае базы мне нужно установить возвращаемое значение в пустой набор. Я понятия не имею, как это сделать и оглядываясь, я не нашел ответа.Создание переменной пустого набора

Когда я запускаю код, я получаю следующее:

1 ?- intersectionx([1,2,3],[3,4,5],Z). 
Z = [3|_G3196] . 

2 ?- differencex([1,2,3],[3,4,5],Z). 
Z = [1, 2|_G3181] 

Вот фактическая построчно с соответствующими предикатами по линиям 16 и 22.

/* memberx */ 
/* test is X a member of set Y, X subset Y */ 
memberx(X1,[X1|_]). 
memberx(X2,[_|T2]) :- memberx(X2, T2). 

/* unionx */ 
/* union sets X and Y and return the resulting set as Z. */ 
unionx([], Y3, Y3).    /* base case */ 
unionx([XH4|XT4], Y4, Z4) :- memberx(XH4, Y4), unionx(XT4, Y4, Z4). 
unionx([XH5|XT5], Y5, [XH5|Z5]) :- not(memberx(XH5, Y5)), unionx(XT5, Y5, Z5). 

/* intersectionx ???*/ 
/* Find the intersection of sets X and Y and return the result as set */ 
/* Z. X intersection Y = Z */ 
intersectionx([], Y6, Z6). /*In the base case here how do I set Z6 to []?*/ 
intersectionx([XH7|XT7], Y7, Z7) :- not(memberx(XH7, Y7)), intersectionx(XT7, Y7, Z7). 
intersectionx([XH8|XT8], Y8, [XH8|Z8]) :- memberx(XH8, Y8), intersectionx(XT8, Y8, Z8). 

/* differencex */ 
/* Find the difference of set X and Y and return the result as set Z. */ 
differencex([], Y9, Z9). 
differencex([XH10|XT10], Y10, [XH10|Z10]) :- not(memberx(XH10, Y10)), differencex(XT10, Y10, Z10). 
differencex([XH10|XT10], Y10, Z10) :- memberx(XH10, Y10), differencex(XT10, Y10, Z10). 

Я знаю, что это, вероятно, относительно простая вещь, но это меня озадачило в течение некоторого времени.

ответ

2

Это довольно просто:

intersectionx([], _, []). 

Я нахожу вашу нумерацию переменных немного странным. Есть ли причина, по которой вы это сделали? Вы можете использовать одни и те же имена переменных в разных предикатах без проблем.

+1

На самом деле это должно быть 'intersectionx ([], _, []).' – gusbro

+0

Спасибо, я исправил его. –

+0

Спасибо. Я знал, что это будет что-то простое, я просто не знал, что. Я цифра переменных, потому что я копирую старое домашнее задание, где мне приходилось делать все это в клаузуальной форме, и профессор потребовал, чтобы мы указали этот путь. Сначала я скопировал его из старого документа, чтобы он стал артефактом этого. Я собираюсь убрать их. – stygma

Смежные вопросы