2009-12-10 2 views
1

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

То, что я в принципе нужно что-то, что возвращает истину, если существуют два элемента одного и того же значения в одном отображении ...

member((_,_),[(a,a),(b,a),(c,a)]). т.е.

Если я использую переменную это делает их унифицированы?

member((A,A),[(a,a),(b,a),(c,a)]). т.е.

Но он возвращает переменную, а не так.

Мне нужно некоторое просветление.

+0

Подчеркивание не подстановочные. Он используется, чтобы указать, что вам все равно, какое значение оно вообще имеет. С точки зрения удовлетворенности ограничений вы вообще не устанавливаете ограничений для этой переменной. Это означает, что два разных символа подчеркивания могут принимать разные значения. Вы можете легко проверить это: '? - member ((,), [(b, c)]). >> true.' – nedned

ответ

5

Ваше решение с переменной правильное.

Возврат переменной - способ вернуть значение true. Это на самом деле означает: эта цель верна, когда var = значение, в отличие от эта цель истинна.

Обратите внимание, что используя это в качестве пункта в другой предикат будет скрывать переменную:

contains_identical_pair(List) :- member((A,A),List). 
2

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

?- \+ \+ member((A,A),[(a,a),(b,a),(c,a)]). 
true. 
+0

это довольно фантазия;) – sharky

2

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

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

wrapper :- 
    predicate(Out1,Out2). 

или:

wrapper(In1,In2) :- 
    predicate(In1,In2,Out1,Out2).