пролог вар обмен - PullRequest
       22

пролог вар обмен

1 голос
/ 09 марта 2012

В некоторых языках программирования для изменения места переменных можно сделать следующее:

A (C, Y, V): = A (Y, C, V)

Как я могу написать это в прологе, не используя списки?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Концепция не существует в Прологе.Как только переменная связана со значением, она буквально перестает быть переменной.Он становится тем, к чему он был привязан.

Вот почему он называется унификация .

Чтобы делать то, что вы хотите, вам нужносделать что-то вроде:

swap (a (C, Y, V), a (Y, C, V)).

Возможно, вы захотите подобрать некоторый справочный материал:

Cover: The Art of Prolog Cover: Programming in Prolog

Эти книги выглядят интересно,хотя у меня нет личного опыта с ними:

Cover: The Craft of Prolog Cover: Clause and Effect

1 голос
/ 10 марта 2012

В прологе (не возвращающем) вы работаете как в чисто функциональной парадигме: ваши состояния не являются неявными в значениях ваших переменных, а являются явными в именах ваших переменных. Это означает, что у вас нет неявного изменения состояния, а есть явное изменение состояний. То есть.,

swap([Y2,C2],[Y,C]) :- [C2,Y2] = [Y,C].

Вы называете это как

swap([Y2,C2], [Y,C]).

и используйте Y2,C2 везде, где вы использовали Y,C раньше. Таким образом, у вас есть обе версии - предыдущая и текущая, но теперь вы можете использовать только последнюю. Я знаю, что вы сказали «нет списков», но это просто синтаксическая деталь, чтобы облегчить глаза / пальцы (вы также можете использовать круглые скобки там).

Кроме того, вы можете просто написать прямо в своем коде

[C2,Y2] = [Y,C],  .... 

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

Кроме того, я от всего сердца рекомендую исключительно ясную и ясную книгу Ивана Братко, а также «Искусство пролога». «Craft» очень разнообразен , а «Clause» фокусируется на нескольких примерах, оба, возможно, лучше, чем вторичное чтение.

Обложка: прологическое программирование для искусственного интеллекта http://ecx.images -amazon.com / images / I / 41VSbrQBSxL._SS500_.jpg

0 голосов
/ 10 марта 2012

Просто мысль: если вы трактуете A как предикат Пролога (я бы предположил, что вы будете, если вы спросите, как это можно сделать в Прологе), безусловно, можно выразить следующее:

'A'(C, Y, V) :- 'A'(Y, C, V).

Кстати, это фактический синтаксис Пролога.Он определяет предикат 'A'/3, который меняет порядок первых двух аргументов.На практике, однако, такой предикат не продвинет вашу программу Prolog слишком далеко, так как он заставит интерпретацию 'A'/3 в бесконечный цикл.

Однако, если вы просто хотите, чтобы ваша база данных содержала 'A'/3 термины, которые отражают намерение, что каждый вставленный факт, совпадающий с 'A'(Y, C, V), также связан с другим фактом, совпадающим с 'A'(C, Y, V) (по любой причине), тогда это действительно возможно следующим образом:

'A'(c, y, v).
'A'(C, Y, V) :- 'A'(Y, C, V).

Выполнениеэто дает:

 ?- 'A'(X,Y,Z).
X = c,
Y = y,
Z = v ;
X = y,
Y = c,
Z = v 

... обратите внимание, что это будет продолжаться при возврате, чтобы дать вам альтернативные привязки, до бесконечности , что не очень полезно.Тем не менее, если вашей программе просто необходимо проверить наличие определенных фактов 'A'/3 с помощью этой программы, вы все равно можете использовать либо once('A'(X,Y,Z)) (если ваш Prolog имеет встроенный once/1), либо составной подцель 'A'(X,Y,Z), ! этого было бы достаточно, если один или несколько фактов для 'A'/3 установлены перед рекурсивным определением.

Хотя я бы не рекомендовал делать это в реальной программе Prolog; -)

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