2015-03-03 2 views
1

У меня есть следующий пролог;Простой пролог, обучение начинающих

customer(Invoice,_,Surname,_,Town),(Town='LA';Town='NEWYORK'), 
order(Invoice,Code,_), 
item(Code,_,_,_,_,_,_) 

Вышеприведенный пролог дает результаты;

Invoice = 51, Surname = 'Hally', Town = 'LA', Code = 54 ; 

Invoice = 51, Surname = 'Hally', Town = 'LA', Code = 58 ; 

Invoice = 51, Surname = 'Hally', Town = 'LA', Code = 85 ; 

Invoice = 51, Surname = 'Hally', Town = 'LA', Code = 148 ; 

Invoice = 71, Surname = 'Steptoe', Town = 'NEWYORK', Code = 148 ; 

Invoice = 71, Surname = 'Steptoe', Town = 'NEWYORK', Code = 176 ; 

Invoice = 73, Surname = 'Ahmed', Town = 'NEWYORK', Code = 180 ; 

Как можно видеть выше, есть два результата с тем же кодом (148), как я могу вернуть только эти два результата? Я попытался добавить ,(Code=Code)., но он не работает.

Я действительно новичок в этом!

Кроме того, я пытаюсь сохранить пролог в новый предикат, чтобы вернуть две фамилии только такие, как показано ниже,

getDuplicateOrders(Surname1, Surname2):- (prolog). 

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

+0

Как общее решение после того, как ты? Вы ищете возможно более двух разных городов и * все * с одним и тем же кодом или * двумя или более * с тем же кодом? – lurker

+0

Только два города будут использоваться, и я хотел бы отфильтровать результат в том же коде, что и в разных городах. Спасибо – Prolog

ответ

3

Вы должны выделить коды, а затем сравнить их:

customer(Invoice1, _, Surname1, _, 'LA'), 
customer(Invoice2, _, Surname2, _, 'NEWYORK'), 
order(Invoice1, Code, _), 
order(Invoice2, Code, _), % We want the same code 
item(Code,_,_,_,_,_,_). 

Этот код, конечно, предполагает, что Счет является уникальным для каждой местности (например, , LA или NEWYORK). Если это не так, тогда в данных должен быть другой способ различать коды для разных заказов, если они действительно отличаются. Если нужно просто обеспечить уникальность счетов-фактур, dif/2 будет работать здесь:

customer(Invoice1, _, Surname1, _, 'LA'), 
customer(Invoice2, _, Surname2, _, 'NEWYORK'), 
dif(Invoice1, Invoice2), 
order(Invoice1, Code, _), 
order(Invoice2, Code, _), % We want the same code 
item(Code,_,_,_,_,_,_). 
+0

Спасибо. Я от императивного программирования, логическое программирование действительно открывает мозг. Это действительно все по-другому. – Prolog

+0

@false, для каких переменных? Я предполагаю, что 'Invoice1' и' Invoice2' уже будут уникальными для разных городов/населенных пунктов. И 'Surname1' и' Surname2' могут совпадать, но это было бы хорошо, так как они разные города/населенные пункты. – lurker

+1

@lurker: Да, вы это принимаете. Но если вы читаете ответ вне контекста (вот почему ответы читаются здесь чаще всего), это несколько подсказывает, что 'Invoice1' и' Invoice2' отличаются своим другим именем. – false

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