刚刚开始学习Prolog,我不知道为什么我会收到这个错误。我无法理解我能做什么。
这是'代码':
?- assert(likes(a , beaf)).
?- assert(likes(b , nuduls)).
?- assert(likes(b , hotdog)).
?- assert(likes(c , sandwicth)).
?- assert(likes(c , bargar).
?- assert(likes(d , juice)).
?- assert(likes(d , chicken_curry)).
?- assert(likes(d , nudules)).
?- assert(likes(e , brade)).
?- assert(likes(e , butter)).
?- assert(likes(e , bargar)).
?- friend(e,d).
?- friend(d,a).
?- friend(d,b).
?- friend(d ,c).
?- highlyrecommended(X,L):-friend(X,Y),likes(Y,L).
?- recommended(X,L):-friend(X,Z),friend(Z,Y),likes(Y,L).
?- Is d is the friend of e ?
?- Y
?- Is e is the friend of c ?
?- Y
?-Who are the friend of d?
a , b , e
true.
此全部错误
2 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
3 ?- | ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
4 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
5 ?- | ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
6 ?- ERROR: Syntax error: Operator expected
ERROR: ?- assert(likes(c , bargar)
ERROR: ** here **
ERROR: .
6 ?- | ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
7 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
8 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
9 ?- | ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
10 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
11 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
12 ?- | ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
13 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
14 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
15 ?- ERROR: Undefined procedure: (?-)/1
ERROR: ?- is the Prolog prompt
ERROR: See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
16 ?- | | | | ERROR: Syntax error: Operator priority clash
ERROR: ?-
ERROR: ** here **
ERROR: highlyrecommended(X,L):-friend(X,Y),likes(Y,L) .
16 ?- ERROR: Syntax error: Operator priority clash
ERROR: ?-
ERROR: ** here **
ERROR: recommended(X,L):-friend(X,Z),friend(Z,Y),likes(Y,L) .
请帮忙吗? 感谢。
答案 0 :(得分:6)
?-
提示您看到的?-
只是一个提示。 Python的解释器打印>>>
,你的shell打印$
,等等 - 它不是语言语法的一部分,它只是语言及其用户多年来采用的惯例。 S.O.在这里非常方便。为交互式查询提供单独的表示法,因为它为您提供了一个关于您应该在哪里输入所见内容的直观线索。
结果是你从不需要提供Prolog ?-
,只需要其他人(用于文档或复制/粘贴到电子邮件或SO问题中)。
如果我们应用此建议,您的代码将变为:
assert(likes(a , beaf)).
assert(likes(b , nuduls)).
assert(likes(b , hotdog)).
assert(likes(c , sandwicth)).
assert(likes(c , bargar).
assert(likes(d , juice)).
assert(likes(d , chicken_curry)).
assert(likes(d , nudules)).
assert(likes(e , brade)).
assert(likes(e , butter)).
assert(likes(e , bargar)).
friend(e,d).
friend(d,a).
friend(d,b).
friend(d ,c).
highlyrecommended(X,L) :- friend(X,Y),likes(Y,L).
recommended(X,L) :- friend(X,Z),friend(Z,Y),likes(Y,L).
assert/1
Prolog在编程语言中是独一无二的,因为它具有内置数据库。大多数情况下,数据库是相当静态,这意味着数据库在任何特定执行期间通常保持不变。但是,您可以使用asserta/1
和assertz/1
在运行时修改事实数据库,它们分别在数据库的顶部或底部插入新事实,retract/1
和retractall/1
删除事实或一系列事实。
没有ISO谓词assert/1
。你必须决定是否要先考虑你的新事实。
无论如何,您不需要在此程序中断言任何内容,因为您不是在规则体内更改数据库。因此,您只需删除assert
包装器,将代码更改为:
likes(a , beaf).
likes(b , nuduls).
likes(b , hotdog).
likes(c , sandwicth).
likes(c , bargar.
likes(d , juice).
likes(d , chicken_curry).
likes(d , nudules).
likes(e , brade).
likes(e , butter).
likes(e , bargar).
friend(e,d).
friend(d,a).
friend(d,b).
friend(d ,c).
虽然我们正在使用它,但让我们修复你的拼写。
likes(a, beef).
likes(b, noodles).
likes(b, hotdog).
likes(c, sandwich).
likes(c, burger).
likes(d, juice).
likes(d, chicken_curry).
likes(d, noodles).
likes(e, bread).
likes(e, butter).
likes(e, burger).
highly_recommended(X,L) :- friend(X,Y), likes(Y,L).
recommended(X,L) :- friend(X,Z), friend(Z,Y), likes(Y,L).
好多了。
在大多数使用解释器的语言中,无论是通过解释器还是通过文件,语言的工作方式都相同。 Prolog在这方面与其他语言不同。 Prolog有两种处理输入的“模式”:咨询使用的模式,定义事实和规则,以及用于查询的模式,这是运行Prolog时获得的模式。
获取上面的所有代码,正确清理,并将其粘贴在名为“first.pl”的文件中。然后运行Prolog并在提示符下键入[first].
并按Enter键。这是你应该看到的:
$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.1)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- [foo].
% foo compiled 0.00 sec, 18 clauses
true.
您只在此处输入两个字:swipl
和[foo].
完全输入!现在您已经查阅了第一个文件,并且可以运行查询。
你的来源的最后五行是英文问题。它们不属于您的输入文件。您必须再次将它们作为查询写入Prolog。以下是我们如何做到这些:
d是e的朋友吗?
?- friend(e,d).
true.
再次,您在此处输入的所有内容均为friend(e,d).
,然后按Enter键。试试吧!
e是c的朋友吗?
?- friend(c,e).
false.
请注意,此处的预期值不正确。
谁是d的朋友?
?- friend(d,X).
X = a ;
X = b ;
X = c.
请注意,您的错误预期答案 e 而不是 c 。这一次,你打算输入friend(d,X).
然后按回车键,然后输入;
就足以让Prolog在你用完之前给你下一个答案。
无论你想从中学到什么资源,你都需要放慢速度,也许还要掌握另一本书。 Prolog对你来说太过分了。要勤奋并仔细阅读。这个问题有点基础,这就是为什么它被如此高度贬低。我们很乐意帮助您学习,但您必须分享。你不能指望每一个小速度爆炸都得到这样的答案。