Пролог = .. функциональность - PullRequest
1 голос
/ 24 ноября 2010

Используя Prolog's = .., возможно ли получить что-то вроде f(x),g(x) из [f,x,g,x]? Я могу использовать H =.. [f,x,g,x], чтобы получить f(x,g,x), но это не то, что я хочу. Извинения, если это глупый вопрос или я использую = .. неправильно или что-то.

Кто-нибудь знает какие-либо хорошие сайты, объясняющие использование = ..?

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

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

В вашем случае кажется, что вы хотите три термина: f(x), g(x) и соединение между ними. Следующая цель, выданная по запросу любой реализации верхнего уровня Prolog, должна работать нормально (здесь я использую GNU Prolog, потому что результаты отображаются более четко, чем, например, SWI):

| ?- Fx =.. [f, x], Gx =.. [g, x], H =.. [',', Fx, Gx].

Fx = f(x)
Gx = g(x)
H = f(x),g(x)

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

Что касается объяснений =../2, я изучал Пролог в классе и в книгах, поэтому я не настолько осведомлен, когда дело доходит до онлайн-ресурсов. Тем не менее, есть другой вопрос StackOverflow , который может быть вам полезен.

1 голос
/ 24 ноября 2010

= .. иногда называют оператором univ, и, насколько я знаю, он работает почти так же, как вы говорите, но только для ОДНОГО функтора.

 ?= f(x,y,z) =.. L

объединяет так, что

L = [f,x,y,z]

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

http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/prolog/ploghelp/univ

0 голосов
/ 24 ноября 2010

Использование univ в каждой соответствующей части списка даст оба условия:

?- Q=[f,x,g,x],[F,X,G,X]=Q,Fx=..[F,X],Gx=..[G,X].
Q = [f, x, g, x],
F = f,
X = x,
G = g,
Fx = f(x),
Gx = g(x).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...