2015-12-06 3 views
1

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

:- op(100, xfx, [has,gives,'does not',eats,lays,isa]). 

, а затем этот факт:

fact :: X isa animal :- 
    member(X, [cheetah,tiger,giraffe,zebra,ostrich,penguin, albatross]). 

Когда я пытаюсь использовать оператора, он говорит, что он не определен, и я просто не понимаю, почему.

?- peter isa tiger. 
ERROR: [Thread pdt_console_client_0_Default Process] toplevel: Undefined 
procedure: (isa)/2 (DWIM could not correct goal) 

Извините, если это что-то глупое (что, вероятно, есть), но я новичок в Prolog. Буду признателен за любую оказанную помощь.

+0

Он работает точно так, как ожидалось, если вы просто удалите 'fact ::'. Чтобы определить правило в Prolog, используйте 'Head: - Body.', например:' X isa animal: - member (...). '. – mat

ответ

3

It is working. Смотрите сами:

 
    [email protected] ~ $ swipl 
    Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.12) 
    % ... 

    ?- op(100, xfx, [has,gives,'does not',eats,lays,isa]). 
    true. 

    ?- Term = (peter isa tiger). 
    Term = peter isa tiger. 

сообщение об ошибке, что вы получили ...

 
    procedure: (isa)/2 (DWIM could not correct goal) 

... говорит, что тоже!

Яснее ли это сейчас?

+1

Ой, хорошо, поэтому вам нужно сохранить его в переменной, чтобы он работал? Я пытаюсь разработать экспертную систему, которая начинает задавать вопросы после того, как я заявляю, что peter isa tiger, поэтому я не уверен, как я могу сделать эту работу без предшествующего ей «Term =». – Reddy

+1

Он работает без 'Term = ...', если у вас есть предикат '(isa)/2'. Вы можете добавить к этому определению в [tag: prolog-toplevel], как это: '? - assert (peter isa tiger) .' ** Затем ** вы можете задать'? - peter isa X.'. Давайте добавим еще одно: '? - assert (peter isa male). И спросите еще раз:'? - peter isa Y. 'Я получаю ответ« X = тигр; X = мужчина. – repeat

+1

Хорошо, это придает мне больше смысла, хотя я пытаюсь сделать команды несколько удобными для пользователя, так что я могу сделать работу «peter isa tiger» без assert(), а? – Reddy