Динамическая генерация тела пролога - PullRequest
0 голосов
/ 10 мая 2011

Для выполнения задания я должен динамически генерировать тело прологической процедуры. Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 10 мая 2011

См. здесь для описания руководства по прологу SWI соответствующих предикатов.

В качестве примера рассмотрим следующее

goal :- Z =.. [foo, 1], 
    Y =.. [bar,2], 
    X =.. [',', Z, Y], 
    R =.. [':-', r, X],  
    assert(Z), assert(Y), assert(X), assert(R).

PS: Другая возможность - это более низкий класс, но иногда может быть лучшим выбором: просто распечатайте то, что вам нужно построить в файл.

0 голосов
/ 20 октября 2016

Вы можете генерировать динамический предикат с включением тела ( и ). 1003

assert(test(X):- (X1 is X+1,  write(X1)))
0 голосов
/ 10 мая 2011

для добавления предиката вам нужно использовать asserta / 1 или assertz / 1 (assert / 1 устарела) more если вы уже объявили некоторые из предложений предиката в загруженном коде, вы должны определить предикат как динамический, используя dynamic / 1 more

формирование предложения зависит от формы ввода. если у вас есть список с именем предиката и аргументами, которые вы можете использовать = .. / 2 если у вас есть предложение для строки, вы можете использовать term_to_atom / 2 (работает в обоих направлениях)

0 голосов
/ 10 мая 2011

заявить / 1, заявить / 1, убрать / 1, убратьВсе / 1, отменить / 1

...