Как создать переменную в предикате пролога

Просто добавьте что-то примечательное здесь.


myQueue.hpp:

template <class T> 
class QueueA {
    int size;
    ...
public:
    template <class T> T dequeue() {
       // implementation here
    }

    bool isEmpty();

    ...
}    

myQueue можно определить методы шаблонного класса, которые просто прекрасны в файле реализации. cpp:

// implementation of regular methods goes like this:
template <class T> bool QueueA<T>::isEmpty() {
    return this->size == 0;
}


main()
{
    QueueA<char> Q;

    ...
}
1
задан Drogba 3 March 2019 в 18:26
поделиться

2 ответа

В декларативных парадигмах инстанцирование невозможно (если вы не используете datafact или что-то подобное), поэтому способ решить вашу проблему - объявить, что пустой список имеет размер 0:

list([],0) :- !.
list([A|B], X1) :- list(B, X0), X1 = X0 + 1.

Таким образом, вы знаете, что длина списка L равна 1+ (длина хвоста L )

0
ответ дан andsanmar 3 March 2019 в 18:26
поделиться

Относительно этой части Вашего примера кода:

X = X + 1

Очень распространенная ошибка для людей, плохо знакомых с Прологом. `` = '' В Прологе означает «то же, что и». Следовательно, приведенный выше фрагмент кода объявляет «X такой же, как X + 1». По крайней мере, это должно быть:

X = Y + 1

Однако это не совсем то, что Вам нужно, потому что:

?- Y = 2 , X = Y + 1  .
X = Y + 1
Y = 2

Для того, чтобы Пролог поставил результат математики вычисление с правой стороны в переменную с левой стороны, используйте _lhs_ is _rhs_.

?- Y = 2 , X is Y + 1  .
X = 3
Y = 2

В отношении вопроса

How can I check if X has a value before doing an increment to it.

when(ground(_variable_),(_thing_to_do)) - лучший из доступных вариантов.

Вот пример решения общей проблемы, поставленной в том, что использует некоторые из этих концепций.

реализация

goal_expansion((_lhs_ =:= _rhs_),(when(ground(_rhs_),(_lhs_ is _rhs_))))  .

:- op(2'1,'yfx','list')  .

_list_ list [size:_size_] :-
_list_ list [size:_size_,shrink:_shrink_] ,
_list_ list [size:_size_,shrink:_shrink_,size:_SIZE_]  .

_list_ list [size:0,shrink:false]  .

_list_ list [size:_size_,shrink:true] :-
when(ground(_size_),(_size_ > 0))  .

[] list [size:0,shrink:false,size:0] .

[_car_|_cdr_] list [size:_size_,shrink:true,size:_SIZE_] :-
(_SIZE_ =:= _size_ - 1) ,
(_size_ =:= _SIZE_ + 1) ,
_cdr_ list [size:_SIZE_]  .

тестирование

/*
   ?- L list Z .
L = [],
Z = [size:0] ? ;
L = [_A],
Z = [size:1] ? ;
L = [_A,_B],
Z = [size:2] ? ;
L = [_A,_B,_C],
Z = [size:3] ?
yes

   ?- L list [size:0] .
L = [] ? ;
no
   ?- L list [size:1] .
L = [_A] ? ;
no
   ?- L list [size:2] .
L = [_A,_B] ? ;
no

   ?- [] list [size:S] .
S = 0 ? ;
no
   ?- [a] list [size:S] .
S = 1 ? ;
no
   ?- [a,b] list [size:S] .
S = 2 ? ;
no
   ?- [a,b,c] list [size:S] .
S = 3 ? ;
no
   ?- 
*/
0
ответ дан Kintalken 3 March 2019 в 18:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: