Prolog未定义的过程和操作员优先级冲突错误?

时间:2013-12-13 04:35:19

标签: prolog

刚刚开始学习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) .

请帮忙吗? 感谢。

1 个答案:

答案 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/1assertz/1在运行时修改事实数据库,它们分别在数据库的顶部或底部插入新事实,retract/1retractall/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。以下是我们如何做到这些:

  1. d是e的朋友吗?

    ?- friend(e,d).
    true.
    

    再次,您在此处输入的所有内容均为friend(e,d).,然后按Enter键。试试吧!

  2. e是c的朋友吗?

    ?- friend(c,e).
    false.
    

    请注意,此处的预期值不正确。

  3. 谁是d的朋友?

    ?- friend(d,X).
    X = a ;
    X = b ;
    X = c.
    

    请注意,您的错误预期答案 e 而不是 c 。这一次,你打算输入friend(d,X).然后按回车键,然后输入;就足以让Prolog在你用完之前给你下一个答案。

    < / LI>

    结论

    无论你想从中学到什么资源,你都需要放慢速度,也许还要掌握另一本书。 Prolog对你来说太过分了。要勤奋并仔细阅读。这个问题有点基础,这就是为什么它被如此高度贬低。我们很乐意帮助您学习,但您必须分享。你不能指望每一个小速度爆炸都得到这样的答案。