2015-03-23 2 views
1

Учитывая эту программу, почему я вынужден определять каждый атом в предикате, даже если они анонимны. Почему неопределенные переменные в предикате dict не считаются анонимными?Соответствие предиката Prolog dict

funt2(X) :- 
    X = point{x:5, y:6}. 

evalfunt(point{x:5, y : 6}) :- 
    write('hello world!'). 

evalfunt(point{x:_, y : _}) :- 
    write('GoodBye world!'). 

Почему я не могу просто сказать

evalfunt(point{x:5}) :- 
     write('GoodBye world!'). 

^, что не будет соответствовать, кстати.

Я могу просто использовать структуру, если мне нужно определить все возможные значения в dict для использования dicts.

Какая мотивация здесь? Могу ли я сделать что-то, чтобы сделать мой предикат кратким? Я пытаюсь определить dict с 30 переменными, и это огромный дорожный блок. Это увеличит размер моей программы на величину, если мне придется определять каждую переменную (анонимно или нет).

+0

Я не уверен, что я понимаю этот вопрос, но я думаю, что главная проблема здесь является понимание того, что 'dict' это просто сложный тип данных, как кортеж, который имеет данные и структуру. Если у вас есть, например, два факта «факт» (точка {x: 5, y: 6)). 'И' fact (point {x: 5}). ', То запрос' fact (point {x: _}). 'будет соответствовать второй, но не первой. И запрос 'fact (point {x: _, y: _}).' Будет соответствовать первому, но не второму. –

+0

Проблема заключается в определении каждого поля в dict, чтобы определить соответствующий предикат. Почему это? Если все, о чем вы заботитесь, это значение X, равное 5, то почему вы должны писать y: _ ... + КАЖДЫЙ другой член в dict –

+0

Потому что, если вы их не пишете, он потенциально будет соответствовать dict's с другой структурой. –

ответ

2

Я был в состоянии сделать то, что мне нужно делая следующее:

checkiffive(Y) :- 
     get_dict(x, Y, V), V=5. 

Для объединения значений из dict необходимо использовать встроенные методы.

Описан в главе 5.4 обращения прологе SWI

http://www.swi-prolog.org/download/devel/doc/SWI-Prolog-7.1.16.pdf

+1

См. Обновление к моему ответу. В SWI-Prolog 7 доступен новый механизм –

4

Dict - это всего лишь сложный тип данных, такой как кортеж, который имеет данные и структуру. Если у вас есть, например, два факта:

fact(point{x:5, y:6}). 
fact(point{x:5}). 

Тогда запрос

fact(point{x:_}). 

будет соответствовать второй, но не первый. И запрос

fact(point{x:_, y:_}). 

будет соответствовать первый, но не второй.

Теперь, если вы хотите, чтобы соответствовать фактам формы fact(point{x:_, y:_, z:_}) только одной конкретной области, вы всегда можете написать хелперов правило:

matchByX(X, P) :- fact(P), P=point{x:X, y:_, z:_}. 

Так имеющие факты:

fact(point{x:5, y:6, z:1}). 
fact(point{x:1, y:2, z:3}). 
fact(point{x:2, y:65, z:4}). 

и quering

matchByX(1, P). 

вернется:

P = point{x:1, y:2, z:3} 


UPDATE:
Кроме того, в SWI-Prolog 7 версии имена полей могут быть подобраны так, чтобы его можно было написано в гораздо более общем виде, даже для фактов с различными структурами:

fact(point{x:5, y:6, z:1}). 
fact(point{x:1, y:2}). 
fact(point{x:2}). 
fact(point{x:2, y:2}). 

matchByField(F, X, P) :- fact(P), P.F = X. 

Так запрос:

?- matchByField(x, 2, P). 
P = point{x:2} ; 
P = point{x:2, y:2}. 
Смежные вопросы