Правило Пролога, которое выводит наклон линии между двумя точками - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь написать правило на Прологе с названием slope_of_line, которое имеет три аргумента. Первые два аргумента - это пары, представляющие две точки на декартовой координатной плоскости. Он должен возвращать наклон линии между двумя точками. Я продолжаю получать сообщение об ошибке и неправильные выходные данные каждый раз, когда запускаю его в SWI-Prolog.

Вот что я написал вместе со своим тестовым кодом.

slope_of_line([H|T],[H1|T1],X) :- !.
slope_of_line is (T-T1)/(H1-H).

:- nl, write('slope_of_line/3:'), nl.
:- write('  1: '), slope_of_line([2 | 4], [4 | 6], X), write(X), nl.
:- write('  2: '), slope_of_line([1 | 3], [-5 | 13], X), write(X), nl.
:- write('  3: '), slope_of_line([3 | -6], [-4 | 7], X), write(X), nl.

Каждый раз, когда я запускаю Правило, я продолжаю получать этот вывод:

ERROR:    No permission to modify static procedure `(is)/2'
slope_of_line/3:
1: _4920
2: _4920
3: _4920

Какие изменения мне нужно сделать, чтобы это работало? Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 12 июля 2020

Вы не должны игнорировать предупреждения о синглтонах. Наверняка у вас их пять в первом предложении ... Затем примечание о вашем выборе синтаксиса. Хотя (ab) и законно, использование конструктора списка для построения пары довольно бесполезно и вызовет проблемы, когда вам в конечном итоге придется понять или повторно использовать свой код в будущем. Используйте вместо этого любую двоичную операцию или (может быть, лучше) подробный, но однозначный конструктор, например point(X,Y). Итак, выбирая первый вариант для компактности, исправление может быть

slope_of_line(H|T,H1|T1,X) :- X is (T1-T)/(H1-H).

?- slope_of_line(2 | 4, 4 | 6, X).
X = 1.

Также обратите внимание на T1-T вместо T-T1. Тогда вы должны попытаться избежать исключения, которое может возникнуть из H1=:=H.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...