Пролог: поместите рекурсивные предикаты в переменную - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в прологе, и мне нужно выполнить следующее упражнение:

Напишите prereqchain с тремя предикатами (P, Q, L), которое после двух курсов P и Q возвращает в L aпредставление всех шагов на обязательном пути от P до Q. Например, prereqchain(comp085,itec450,L) должен дать ответ

L=prerequisite(comp085, comp101, 
prerequisite(comp101, comp281, 
prerequisite(comp281, itec450))).

В основном, база данных знаний обозначает обязательные отношения между курсами степени.Моя основная проблема заключается в том, как я могу перехватить трассировку рекурсивных вызовов и поместить ее в переменную?С другой стороны, на самом деле не все следы, потому что мне просто нужны вызовы, где переменные были заменены значениями.

Большое спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Каков ваш базовый случай?Это будет выглядеть так:

prereqchain(Start, End, prerequisite(Start, End)) :-
    prerequisite(Start, End).

Это дает вам следующую ситуацию:

?- prereqchain(comp281, itec450, L).
L = prerequisite(comp281, itec450).

Итак, это первое, что вам нужно, теперь то, что происходит, когда вы запрашиваете prereqchain(comp101, itec450)?Вам нужен индуктивный случай, который следует за остальной частью цепочки:

prereqchain(Start, End, prerequisite(Start, Middle, Tail)) :-
    prerequisite(Start, Middle),
    prereqchain(Middle, End, Tail).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...