2016-11-20 4 views
0

Я сделал функцию, которая вычисляет длину вектора и размер 2D-матрицы.Оператор Prolog '==' не работает?

Ниже приведена функция. Я использую SWI-Prolog:

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
write("vector len : "), write(COUNT1), 
write(", 2D array size : "), write(COUNT2). 

Да, я намеренно исключить подробную listLength, twoDarray функцию.

Однако две функции верны. Итак, COUNT1 переменная хранит длину вектора и COUNT2 переменная хранит размер 2D-массива.

Также вводимая переменная LIST означает вектор. 2-мерная таблица фиксирована (7 на 7).

При запуске кода с входом?:

- Foo ([1, 2, 3, 4, 5]).

он выводит:

вектор Len: 5, 2D размер массива: 49

result(1)

Но, когда я изменил выше кода, как показано ниже,

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
(COUNT1 == COUNT2). 

не прекращается. Моя цель - сравнить COUNT1 и COUNT2. Если две переменные одинаковые, то возвращается true иначе возвращается false.

Однако он не работает даже с одним и тем же входом.

result(2)

Что является причиной этого, и как я могу это исправить?

ответ

0

Поскольку интерпретатор Prolog возвращается, когда цель не работает, он повторяет twoDarray/1 в том случае, если он может вернуть другое значение для COUNT2. По умолчанию отношения Prolog имеют несколько ответов. Вы должны сказать машине Prolog, что конкретное отношение является функцией, то есть допускает только один ответ.

Чтобы сообщить, что отношение функционально, вы можете использовать оператор cut. Если вы не хотите изменять определения twoDarray/1 и listLength/2, вы можете ввести разрез прямо в свое определение foo/1. Оператор разреза обозначается символом восклицательной метки.

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),!, 
(COUNT1 == COUNT2). 
0

Следующий код

listLength(_, 5). 
twoDarray(49). 

foo(LIST) :- 
    listLength(LIST, COUNT1), 
    twoDarray(COUNT2), 
    (COUNT1 == COUNT2). 

работы (возврат немедленно ошибку) с моим gprolog и с моим SWI-Prolog.

Так, я полагаю, проблема в вашем listLength/2 или в вашем twoDarray/1.

Предложение: замените свой listLength/2 моим поддельным и повторите попытку.

Следующая попытка с моей подделкой twoDarray/1.

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