2015-05-21 3 views
-1

Я пытаюсь сделать счетчик из следующего кода:Создание счетчика Пролог

contador([], 0,[]). 
contador([via(A,_,_)|R], Tot,Regiao):- 
    cidade(A,_,_,Reg1),Reg1==Regiao, 
    Tr is Tot + 1, 
    contador(R,Tr,Regiao). 

Учитывая формат моего списка и Cidade:

L=[via(porto,lisboa,_),via(braga,faro,_),via(guimaraes,santarem,_)] 

cidade(lisboa,_,_,A) 

Почему это не работает?

cidade(porto,portugal,40,litoral). 
cidade(braga,portugal,350,interior). 
cidade(guimares,portugal,40,litoral). 
cidade(alverca,portugal,30,valedotejo). 
cidade(santarem,portugal,25,valedotejo). 
cidade(faro,portugal,20,litoral). 
cidade(sevilha,espanha,60,interior). 

С помощью этого списка:

A = [via(porto, braga, 5), via(braga, guimaraes, 9), via(guimaraes, alverca, 7), via(alverca, faro, 10)] ; 

Я пытаюсь сделать следующее:

?-contador(A,Tot,litoral). 
false. 

Моя цель состоит в том, чтобы сосчитать города, которые имеют A(cidades(_,_,_,A)) в качестве параметра.

+2

Показать полный код, включая факты базы данных и запрос, который вы пытаетесь запустить. –

+0

Что произойдет, если 'Regiao' и' Reg1' отличаются? – false

+0

Он должен пропустить этот элемент списка, а не увеличивать Tot и перейти к следующему – sirsomething

ответ

0

В коде, который вы представили, имеется несколько вопросов.

1)

Во-первых, замечание, в прологе, "=" не является, как и в присваивания C/C++ и другие императивными lenguages. Это означает, что вы не можете набрать:

A=[...]. 
contador(...). 

но использовать один запрос:

A=[...],contador(...). 

2)

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

contador([], 0,[]). 
contador([via(A,_,_)|R], Tot,Regiao):-... 

, потому что третий аргумент находится в первом списке и не во втором.

3)

Наконец, то, что вы называете «Контадор/счетчик» (и это, вероятно, лучше назвать «acumulator») не правильно «закончил». Когда исходный список исчерпан, заявление:

contador([], 0,[]). 

применяется, но этот счетчик запросов к заявлению равен cero. Возможно, это будет лучше, что-то вроде:

contador([], R, _) :- ... /* do something with R */ 

4)

Эти два заявления:

cidade(A,_,_,Reg1),Reg1==Regiao, 

могут быть объединены в одном одном:

cidade(A,_,_,Regiao), 

5) В общем, попробуйте пропустить оператор «есть».К примеру, заменить:

Tr is Tot + 1, 

с:

succ(Tot,Tr), 

6)

Если заявление:

cidade(A,_,_,Reg1),Reg1==Regiao, 

сломается, вы не альтернативное правило.

+0

Используя его следующим образом: ' contador ([], 0, _) contador ([через (A, _, _) | R], Tot, Regiao): - \t cidade (A, _, _, Regiao), \t succ (Tot , Tr), \t contador (R, Tr, Regiao). '' При достижении succ (Tot, Tr) он говорит, что аргументы недостаточно созданы. – sirsomething

+0

В запросе вы должны передать интуитивный счетчик равным «0», , –

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