Учебное пособие: Язык логического программирования Visual Prolog
person(X, Sex, _),
person(Sex, Y, _).
Несмотря на то, что и name и sex описываются как symbol, они не эквивалентны друг другу. Это и позволяет VisualProlog определить ошибку, если вы перепутаете их. Это полезно в тех случаях, когда ваши программы очень велики и сложны.
Аргументы с типами из специальных доменов не могут смешиваться между собой, даже если эти домены одинаковы.
Следующий пример программы при его загрузке приведет к ошибке типа.
Domainsproduct, sum = integer
predicates
add_em_up(sum,sum,sum)
multiply_em(product,product,product)
clauses
add_em_up(X, Y, Sum):-Sum=X+Y.
multiply_em(X,Y,Product):-Product=X*Y.
Эта программа выполняет две операции: складывает и умножает. Зададим ей следующую цель:
add_em_up(32, 54, Sum) .
Visual Prolog (Test Goal) ответит:
Sum=86
1 Solution
что является суммой двух целых чисел, которые вы передали в программу.
С другой стороны, эта же программа с помощью предиката multiply_em умножает два аргумента. Допустим, мы хотим удвоить произведение 31 на 17. Задаем следующую цель:
multiply_em(31, 17, Sum), add_em_up(Sum, Sum, Answer).
иждем, чтоVisual Prolog (Test Goal) ответит:
Sum=527, Answer=1054
1 Solution
Однако вместо этого вы получите ошибку типа. Это случилось из-за того, что имела место попытка передать результирующее значение предиката multiply_em, которое относится к домену product, в качестве первого и второго аргументов (которые должны относится к домену sum) в предикат add_em_up. И хотя оба эти домена соответствуют типу integer — это различные домены.
Если переменная в предложении используется более чем в одном предикате, она должна быть одинаково объявлена в каждом из них.
13. Раздел цели
По существу, раздел goal (цели) аналогичен телу правила: это просто список подцелей. Цель отличается от правила лишь следующим:
· за ключевым словом goal не следует :-;
· при запуске программы VisualProlog автоматически выполняет цель.
Если все подцели в разделе goal истинны, — программа завершается успешно. Если же какая-то подцель из раздела goal ложна, то считается, что программа завершается неуспешно (хотя чисто внешне никакой разницы в этих случаях нет, — программа просто завершит свою работу).