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

时间:2014-04-18 03:28:06

标签: prolog

我在Prolog中真的很新(可能是几个小时)而且我收到了这些错误和警告,最重要的是请告诉我如何解决该错误及其来源。

My program

这种语言太模糊了。

谢谢。

   :- 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).

这是我得到的错误:

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

1 个答案:

答案 0 :(得分:6)

你这里有很多问题。

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

    我在最后三行谈论Schedule,这在语法上是不正确的。你可能在这里指的是schedule,这可能是导致你到这里的语法错误的来源。

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

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

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

  3. Schedule/3 *”中的无限递归。

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

    predicate(V1, V2... VN) :- predicate(V1, V2... VN), ...
    

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

  4. Prolog中没有“功能”。

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

    duration(C, Duration),
    difference(E, S, Difference),
    Duration =< Difference
    

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

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

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