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

use*_*032 -3 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.
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)

有什么帮助吗?谢谢.

Dan*_*ons 6

?-提示

?-你看到的只是一个提示.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/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).
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.以下是我们如何做到这些:

  1. d是e的朋友吗?

    ?- friend(e,d).
    true.
    
    Run Code Online (Sandbox Code Playgroud)

    再次,您在这里friend(e,d).输入的所有内容都是,然后按Enter键.试试吧!

  2. e是c的朋友吗?

    ?- friend(c,e).
    false.
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您的预期值不正确.

  3. 谁是d的朋友?

    ?- friend(d,X).
    X = a ;
    X = b ;
    X = c.
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您的错误预期答案e而不是c.这一次,你打算输入friend(d,X).并输入,然后输入一个;就足以让Prolog给你下一个答案,直到它用完为止.

结论

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

  • 友好的话语很棒的答案! (3认同)