У меня есть следующая проблема:
программа пролога:
man(thomas, 2010).
man(leon, 2011).
man(thomas, 2012).
man(Man) :- once(man(Man, _).
проблема:
?- man(thomas).
true ; %i want only on true even if there are more "thomas" *working because of once()*
?- man(X).
X = thomas ; %i want all man to be listed *isn't working*
цель:
?- man(thomas).
true ;
?- man(X).
X = thomas ;
X = leon ;
X = thomas ;
Я понимаю, почему это происходит, но все же хочу получить имена всех людей. Итак, мое решение будет заключаться в том, чтобы посмотреть, инициализирован ли «Человек», если да, то «один раз..», иначе... что-то вроде этого:
man(Man) :- (->check<-,once(man(Man, _)); man(Man, _).
При «проверке» должен быть снят код, который проверяет, заполнена ли переменная «Человек».
Это возможно?
man(X)
. Я получаюX = thomas
. И если я ввожуman(_)
, я получаюtrue
. Если вы хотите проверить, был ли уже создан экземпляр переменной, вы можете использоватьvar(Man)
(true означает отсутствие экземпляра). - person lurker   schedule 06.01.2014_
. Он будет отвечать только true или false, так как он анонимен! Вам нужноX
или что-то в этом роде. Что касается ваших предикатов, пожалуйста, обновите (отредактируйте) описание проблемы, указав дополнительную информацию для ясности. :) - person lurker   schedule 06.01.2014Mann
не конкретизирован, он выбираетm(Mann, _)
, потому что это то, что говорит логика. И если создается экземплярMann
(например, вы вводитеman(thomas).
, то выбираетсяonce(m(Mann,_))
. Я не уверен, что понимаю, какую логику вы хотите установить. - person lurker   schedule 06.01.2014man(thomas).
дает мне истинное 3 раза. :/ - person Spenhouet   schedule 06.01.2014man(thomas)
дал только одинtrue
, а только то, что он далtrue
. У него есть несколько решений, потому что (а) есть два элемента базы данных, которые имеютthomas
, поэтому он находит оба, и (б) он снова будет успешным благодаря вашему или пункту;
. - person lurker   schedule 06.01.2014man(thomas).
, но человек (X) и мужчина (_) должны работать нормально. - person Spenhouet   schedule 06.01.2014nonvar
. Хороший улов. :) - person lurker   schedule 06.01.2014