无法在Prolog中使用用户定义的运算符

无法在Prolog中使用用户定义的运算符,prolog,operators,user-defined,Prolog,Operators,User Defined,在这个问题上我已经被困了很长一段时间,我的Prolog程序在其操作符定义中有以下行: :- 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 t

在这个问题上我已经被困了很长一段时间,我的Prolog程序在其操作符定义中有以下行:

:- 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)

对不起,如果这是一些愚蠢的事情(它可能是),但我是新的序言。非常感谢任何帮助。

正在工作。你自己看看:

stefan@stefan-Lenovo-G510 ~ $ 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. stefan@stefan-联想G510~$swipl 欢迎使用SWI Prolog(多线程,64位,版本7.3.12) % ... ?-op(100,xfx,[拥有、给予、不拥有、吃、放、isa])。 对。 ?-术语=(彼得·伊萨·泰格)。 泰姆=彼得是一只老虎。 您收到的错误消息

procedure: (isa)/2 (DWIM could not correct goal) 程序:(isa)/2(DWIM无法纠正目标) 。。。我也这么说


现在更清楚了吗?

哦,好的,那么您必须将其存储在变量中才能工作?我正在尝试开发一个专家系统,在我声明peter isa tiger之后开始提问,因此我不确定如果前面没有“Term=”的话,我怎么能让它工作。如果你有一个谓词
(isa)/2
,它就没有
Term=…
。您可以这样添加到该定义中:
?-assert(peter isa tiger)。
然后您可以询问
?-peter isa X.
。让我们再添加一个:
?-assert(peter isa male)。
然后再次询问:
?-peter isa Y.
我得到了答案
X=tiger;X=male
。好吧,这对我来说更有意义,尽管我正在尝试让命令变得更加友好,那么有没有办法让peter isa tiger在没有assert()的情况下也可以工作?直接在?否。
X isa Y
是一个有效的目标。要知道,请使用@user2023740。如果您的目标是实现一个专家系统,那么设计和实现REPL/toplevel/shell是很重要的,并且应该根据您心目中的具体用例进行定制。如果您只需删除
事实::
,它就会完全按照预期工作。要在序言中定义规则,请使用
Head:-Body.
,例如:
X isa animal:-member(…)。