Функциональные входы и выходы в PROLOG - PullRequest
1 голос
/ 23 августа 2011

Я строю некоторые относительно простые функции в PROLOG, которые принимают один вход и один выход.Для простоты, что-то вроде

func(List, Item, [Item | List]).

Теперь у меня есть код, который будет вызывать несколько из этих функций подряд и передавать результат дальше.Проблема в том, что я должен продолжать создавать новые имена переменных для всех выходных данных.

someOtherFunc(List, Item) :-
   func(List, Item, Output1),
   doSomething(Output1).

Проблема здесь в том, что у меня на самом деле есть несколько func и несколько doSomething, и я действительно был бы рад, если бы у меня не былоявно связать переменную Output1.Есть ли способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Я не уверен в том, что вы спрашиваете, но прежде всего обратите внимание, что это не функции, а предикаты. Это совершенно другая парадигма программирования. Переменные не являются «ящиками», в которые вы вводите и выводите некоторые данные: они ближе к математическому значению переменной, поскольку, когда вы связываете их с некоторыми ограничениями их значений, это навсегда.

Если вернуться к вашему вопросу, ответ - нет, вы не можете избежать привязки какого-либо Output1 к этому. Иногда вы можете вставить подчеркивание, чтобы сказать прологу, что вам не важно это значение, но при этом вы теряете возможность использовать это значение. В вашем примере вы хотели бы сделать что-то вроде этого (в императивном псевдокоде):

var list = ..., item = ...;
doSomething(func(list, item));

Насколько я знаю, в прологе нет другого пути, вы просто должны использовать промежуточные переменные, как и раньше. Единственное улучшение, которое я могу предложить, - это очень тщательно выбирать предикаты и имена переменных.

0 голосов
/ 16 марта 2019
func1(Input1, Input2) :-
   func2(Input1, Input2, Output1),
   useFun(Output1, Output2).
/* Output2 the result I obtain from the function useFun */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...