О правилах в прологе., - PullRequest
4 голосов
/ 13 марта 2011

В моей программе есть несколько правил, таких как:

tellme(X) :- knows(X).
tellme(friends1(X)) :-  tellme(X).
tellme(friends2(X)) :-  tellme(X).
tellme(friends3(X)) :-  tellme(X).
.
.
.
tellme(friends25(X)) :- tellme(X).

Теперь эти friends1, friends2, friends3 ..... зависят от N, который является переменной. Здесь, например, значение моего N равно 25. Итак, возможно ли написать правило для генерации этих правил до N, или я должен вручную написать эти правила для N раз. Любые предложения или решения приветствуются. Большое спасибо за ваше внимание.

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Вы можете генерировать любой вид и количество кода в большинстве современных сред Prolog, используя term extension , с некоторой помощью универсального оператора . Следующий пример работает для SWI:

term_expansion(gen_tellme(N), Terms) :-
    findall((tellme(F) :- tellme(X)),
            (between(1, N, I), atom_concat(friend, I, Fi), F =.. [Fi, X]),
            Terms).

gen_tellme(25). % generates 25 copies of the tellme clause.

Тем не менее, встраивание информации в имя предиката, то есть номер друга, как правило, не очень хороший дизайн. Почему бы не переписать код, используя friend(N, X), где N - это число?

1 голос
/ 13 марта 2011

У вас может быть некоторый успех с бинарным функтором friends(N,X) вместо одного функтора на N. Вы можете изменить tellme и knows на два аргумента. (knows(X) не имеет для меня непосредственного значения, поэтому я не совсем понимаю, что вы ищете.)

Если по какой-то причине это не то, что вам нужно, вы можете создать новый функтор с чем-то вроде ( untested )

friends_functor(N, Functor) :-
    number(N),
    atom_concat(friend, N, Functor).

Затем используйте asserta или assertz. Я действительно не понимаю, почему вы хотите это сделать.

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