2013-05-16 2 views
0

У меня есть школьный проект, где мне нужно работать с Prolog. Это для меня все ново, поэтому у меня проблемы.Объединение (?) В Прологе

У меня есть список, как это:

List = [(_,_,_),(_,_,_),(_,_,_)] 

Я должен получить от ввода информации о каждом элементе в, через несколько предикатов, которые я должен создать.

Один из них относится к типу:

predicate(M1,M2,M3, List) 

, и он говорит, что M1 либо M2 или M3, но не оба. Например,

predicate((_,a,_),(2,_,_),(3,_,_),List) 

утверждает, что элемент с 'a' имеет либо 2, либо 3 в первом поле.

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

Я попытался это:

predicate(M1,M2,M3,[_]) :- (M1=M2), not(M1=M3). 
predicate(M1,M2,M3,[_]) :- (M1=M3), not(M1=M2). 

Это может выглядеть смешно, но, как я сказал, Пролог является совершенно новым для меня, и я не могу вполне понять его функционирование.

Подсказка приветствуется. Благодаря!

EDIT:

Пример:

person(name,age,job). 
List = [(einstein,_,_),_,_]. 

Так что теперь у меня есть список список из 3-х человек, с Эйнштейном в первой позиции.

predicate = ((einstein,_,_),(_,87,_),(_,23,_), List). 

List = [(einstein,87,_),_,_)]; 
List = [(einstein,23,_),_,_)]. 

Эти два признанных списка после применения предиката.

Это должна быть простая проблема, но я не могу понять это.

Спасибо!

+0

Ну, я попытался объяснить это в вопросе. Не уверен, что еще добавить. Предполагается, что предикат получит свойства около 3 членов списка, что означает, что первый будет таким же, как один из двух других. (hifen - символ подчеркивания, не могу написать его здесь) предикат ((einstein, -, -), (-, 32, -), (-, 45, -), List) означает, что эйнштейн либо например, 32 или 45 лет. – bex91

+0

отредактировал :) Надеюсь, теперь это яснее. – bex91

+0

Извините, я не видел этого вопроса. Я искал, но не заметил. Я считаю, что это относится к моей проблеме. Я постараюсь максимально использовать его. Благодаря! – bex91

ответ

1

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

predicate(M1, M2, M3, [M1, M2, M3]) :- 
    M1 = M2, M1 \= M3 
    ; M1 = M3, M1 \= M2. 

EDIT: после комментариев

predicate(M1, M2, M3, List) :- 
    member(M1, List), 
    (M1 = M2, M1 \= M3 ; M1 = M3, M1 \= M2). 

член/2 это самое основное отношение в Прологе между списком и его элементов , Здесь он показывает способность базового движка связывать переменные во время поиска решения.

Данные дает

?- predicate((einstein,_,_),(_,87,_),(_,23,_), [E]). 
E = (einstein, 87, _G3908) ; 
E = (einstein, 23, _G3908). 
+0

Спасибо за вашу помощь, но я не думаю, что правильно объяснил. Сожалею. M2 и M3 должны быть вне списка, где M1. Я отредактировал вопрос, и я думаю, что теперь это понятно: D – bex91

+0

Еще раз спасибо. Я тестировал этот код, и результат все еще не идеальный, но он приближается. Я получил это: E = [(einstein, 87, _G824), _G832, _G835]; E = [(einstein, 23, _G824), _G832, _G835]; E = [(einstein, _G823, _G824), (einstein, 87, _G842), _G835]; E = [(einstein, _G823, _G824), (einstein, 23, _G842), _G835]; E = [(einstein, _G823, _G824), _G832, (einstein, 87, _G842)]; E = [(einstein, _G823, _G824), _G832, (einstein, 23, _G842)]; – bex91

+0

Извините, я не знаю, как правильно отформатировать текст здесь :(Проблема в том, что он распространяет einstein на остальную часть списка. Есть ли способ избежать этого? – bex91

0

Пролог очень отличается от других языков программирования.Попытка не является необоснованным, но было бы лучше читать как:

predicate(M1,M1,M3,[_]) :- M1 \= M3. 
predicate(M1,M2,M1,[_]) :- M1 \= M2. 

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

1

Я бы написал так:

predicate(M1,M2,M3,L):- member(M1,L),member(M1,[M2,M3]). 

вы говорите, «он говорит, что M1 либо M2 или M3, но не оба», но я думаю, что это вашей ответственности, как вызвавшее это сказуемое. Если вы поставили равные M2 и M3, очевидно, что вы хотели их равных. И если вы поставили их по-другому, ну, вот что они собой представляют.

+0

Эй, спасибо за отзывы.Я не могу понять, что вы имеете в виду. Предположим, что я получаю этот вход: предикат ((einstein, -, -), (-, 32, -), (-, -, пловец), L) Что Mn = M2, M1 = M3 будет истинным, что не работает в соответствии с моим предикатом. – bex91

+0

@bex вы не объясняете/не показываете пример использования Возможно, я вас неправильно понял. –

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