Prolog,Prolog中的新功能和语法错误

Nod*_*.JS -2 prolog

我是Prolog的新手(也许是几个小时),我收到这些错误和警告,最重要的是请告诉我如何解决这个错误及其来源.

我的节目

这种语言太模糊了.

谢谢.

   :- redefine_system_predicate(legalTime(T)).
       legalTime(T,[T|_]).
       legalTime(T,[_|S]) :- legalTime(T,S).

   :- redefine_system_predicate(subset(_,_)).
       subset([],_).
       subset([T|S],K) :- legalTime(T,K), subset(S,K).

   disjoint([],_).
   disjoint([T|S],K) :- not(legalTime(T,K)), disjoint(S,K).

   :- redefine_system_predicate(union(_,_,_)).
      union(L,K,M) :- append(L,K,M).

   :- redefine_system_predicate(intersection(_,_,_)).
       intersection([],_,[]).
       intersection([T|S],K,M) :-not(legalTime(X,K)), intersection(S,K,M).
       intersection([T|S],K,[X|M]) :- legalTime(T,K), intersection(S,K,M).

      difference([],_,[]).
      difference([T|S],K,M) :- legalTime(X,K), difference(S,K,M).
      difference([X|L],K,[X|M]) :- not(legalTime(X,K)), difference(L,K,M).

   :- redefine_system_predicate(legal_Schedule(X)).
      legal_Schedule(X,[X|_]).
      legal_Schedule(X,[_|S]) :- legal_Schedule(X,S).

Schedule(C, R, between(S, E)) :- Schedule(C, R, between(S, E)), between(S, E).
Schedule(C, R, between(S, E)) :- Schedule(C, R, between(S, E)), C depends on R.
Schedule(C, R, between(S, E)) :- Schedule(C, R, between (S, E)), duration(C)=<difference(E,S).
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Warning: c:/users/amir-i7/desktop/hwk11.pl:24:
        Singleton variables: [X]
ERROR: c:/users/amir-i7/desktop/hwk11.pl:28:8: Syntax error: Operator expected
ERROR: c:/users/amir-i7/desktop/hwk11.pl:29:8: Syntax error: Operator expected
ERROR: c:/users/amir-i7/desktop/hwk11.pl:30:8: Syntax error: Operator expected
% c:/Users/Amir-i7/Desktop/hwk11.pl compiled 0.02 sec, 16 clauses
Run Code Online (Sandbox Code Playgroud)

Dan*_*ons 6

你这里有很多问题.

  1. 谓词必须以小写字母开头.

    我在谈论Schedule最后三行,这在语法上是不正确的.你可能schedule在这里意味着这可能是语法错误的来源,它带你到这里.

  2. 如果谓词不是系统谓词,则无需警告覆盖系统谓词.

    Prolog不附带legalTime/1,legal_Schedule/1因此这些指令不做任何事情.此外,谓词union/3,intersection/3而subset/2不是系统谓词 - 如果提供它们(library(lists)与SWI一样),它们不是全局范围的一部分.所以你应该忘记你曾经看过这个指令 - 即使你正确地使用它,它也是一种代码味道.

    更重要的是,这些指令不适用于跟随它们的谓词.我认为你已经假设"回归价值"或其他东西不会"算作"作为arity的一部分,但Prolog在其他语言的意义上没有"回归价值"; 形式参数包含谓词的所有输入和输出.你的声明subset/2,union/3并且intersection/3是正确的,但是你打错元数的legalTime和legal_Schedule和,因为你在后者使用非匿名的变量,你得到一个单变量警告.

  3. " Schedule/3*"中无限递归.

    您的规则遵循以下一般形式:

    predicate(V1, V2... VN) :- predicate(V1, V2... VN), ...
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个毫无意义的无限循环.我认为你需要在:-重复该条款的头部之后删除该部分.如果有一个原因需要重复,你可能应该在你做的测试后做,而不是完全相同的输入.

  4. Prolog中没有"功能".

    声明duration(C) =< difference(E, S)不会做你想要的.同样,Prolog没有返回值,因此这不会神奇地发送E并S通过您的difference/3谓词并在此处将第三个参数替换为值.更重要的是,Prolog根本不会评估这样的术语.我敢打赌duration/2,你的代码示例中没有包含其他地方的谓词,并且在那里有相同的期望.如果要将其重写为实际的Prolog代码,它可能最终会看起来像这样:

    duration(C, Duration),
    difference(E, S, Difference),
    Duration =< Difference
    
    Run Code Online (Sandbox Code Playgroud)

    我希望你会对此感到惊讶.这不是Prolog,而是其他含糊不清的语言.Prolog实际上很简单,并且在表达形式及其评估方式方面非常明确.其他语言有许多你内化的特殊规则; Prolog只是走另一条路,所以让你感到困惑.但这并不含糊.(如果你避免诋毁你需要帮助的东西,你可能会发现你会得到更好的帮助 - 毕竟,帮助将来自喜欢它的人.)

这里你最大的问题是你希望Prolog像其他编程语言一样工作.可能你有一个非常密集的课程安排,只是无法给予Prolog所需的注意力.对此没有快速简便的补救措施.你只需要打开你的Prolog编程或Prolog的艺术副本,再次重读那些无聊的第一章.我保证,你会感到惊讶.

在将来,我建议您包含所有代码,而不仅仅是失败的部分.由于这个原因,我有比你特别提到的更多的编译问题.当你没有真正的问题而不是"有人请你做这个工作!" 没有所有代码,很难提供帮助.