刚刚开始学习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.
Run Code Online (Sandbox Code Playgroud)
这一切都错了
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) .
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?谢谢.
?-
提示在?-
你看到的只是一个提示.Python的解释器打印>>>
,你的shell打印$
等等 - 它不是语言语法的一部分,它只是语言及其用户多年来采用的惯例.在SO上,为交互式查询提供单独的符号非常方便,因为它为您提供了一个视觉线索,告诉您应该在哪里输入您所看到的内容.
结果是你永远不需要给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).
Run Code Online (Sandbox Code Playgroud)
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).
Run Code Online (Sandbox Code Playgroud)
当我们在这里时,让我们修复你的拼写.
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).
Run Code Online (Sandbox Code Playgroud)
好多了.
在大多数使用解释器的语言中,无论是通过解释器还是通过文件,语言都以相同的方式工作.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.
Run Code Online (Sandbox Code Playgroud)
你只在这里输入两个单词:swipl
并[foo].
准确输入它们!现在您已经查阅了第一个文件,并且可以运行查询.
你的来源的最后五行是英文问题.它们不属于您的输入文件.您必须再次将它们作为查询写入Prolog.以下是我们如何做到这些:
d是e的朋友吗?
?- friend(e,d).
true.
Run Code Online (Sandbox Code Playgroud)
再次,您在这里friend(e,d).
输入的所有内容都是,然后按Enter键.试试吧!
e是c的朋友吗?
?- friend(c,e).
false.
Run Code Online (Sandbox Code Playgroud)
请注意,您的预期值不正确.
谁是d的朋友?
?- friend(d,X).
X = a ;
X = b ;
X = c.
Run Code Online (Sandbox Code Playgroud)
请注意,您的错误预期答案e而不是c.这一次,你打算输入friend(d,X).
并输入,然后输入一个;
就足以让Prolog给你下一个答案,直到它用完为止.
无论你想从中学到什么资源,你都需要放慢速度,也许还要掌握另一本书.Prolog对你来说太过分了.要勤奋并仔细阅读.这个问题有点基础,这就是为什么它被如此高度贬低.我们很乐意帮助您学习,但您必须分享.你不能指望每一个小速度爆发都得到这样的答案.