当前位置: 代码迷 >> 其他开发语言 >> 哪位高手有会prolog?了解的人好少,求解答小弟的一个有关问题,谢了
  详细解决方案

哪位高手有会prolog?了解的人好少,求解答小弟的一个有关问题,谢了

热度:8060   发布时间:2013-02-26 00:00:00.0
谁有会prolog?了解的人好少,求解答小弟的一个问题,谢了
最近在做一个人工智能方面的题目,用prolog语言,用的是visual prolog,题目是求1-100有多少个素数,好像很少人知道这方面的,只有想到CSDN中你们这些牛人了
代码如下:我自己定义了一个fyl类,程序运行时说:main.pro(20,9) error c631: The predicate 'main::run/0', which is declared as 'procedure', is actually 'determ' ,我在main.cl中predicatesrun : core::runnable determ.已经加入了还是有误,fyl类中有关的声明和子句如下:

%fyl.cs

class fyl : fyl
  open core

predicates
  classInfo : core::classInfo.
  primes:(integer,integer*) determ(i,o).
  integers:(integer,integer,integer*) determ(i,i,o).
  sift:(integer*,integer*) determ(i,o).
  remove:(integer,integer*,integer*) determ(i,i,o).
  % @short Class information predicate. 
  % @detail This predicate represents information predicate of this class.
  % @end

end class fyl

%fyl.pro

implement fyl
  open core

constants
  className = "fyl/fyl".
  classVersion = "".

clauses
  classInfo(className, classVersion).
  primes(Limit,Ps):-integers(2,Limit,Is),sift(Is,Ps).
  integers(Low,High,[Low|Rest]):-Low < High,!,M=Low+1,integers(M,High,Rest).
  integers(_,_,[]).
  sift([],[]).
  sift([I|Is],[I|Ps]):-remove(I,Is,New),sift(New,Ps).
  remove(P,[],[]).
  remove(P,[I|Is],[I|Nis]):-not(0=I mod P),!,remove(P,Is,Nis).
  remove(P,[I|Is],Nis):-0=I mod P,!,remove(P,Is,Nis).
end implement fyl

implement main
  open core

constants
  className = "main".
  classVersion = "".

clauses
  classInfo(className, classVersion).
   
clauses
  run():-
  console::init(),
  fyl::primes(100,List),
  stdIO::write("The SuShu list (bubblesort) is: ",List),
  stdIO::nl.
end implement main

goal
  mainExe::run(main::run).

我的main.pro为:

implement main
  open core

constants
  className = "main".
  classVersion = "".

clauses
  classInfo(className, classVersion).
   
clauses
  run():-
  console::init(),
  fyl::primes(100,List),
  stdIO::write("The SuShu list (bubblesort) is: ",List),
  stdIO::nl.
end implement main

goal
  mainExe::run(main::run).


另外还有到题目是求解两个升序表如何合并成一个升序表,最好给出代码,会有追加分给的呵












------解决方案--------------------------------------------------------
过了这么久不知道LZ还关注个帖否。
看了一下integers,sift,remove这三个谓词的子句部分应该可以是procedure型的。
这样的话primes(Limit,Ps):-integers(2,Limit,Is),sift(Is,Ps).也就是procedure型的,就可以直接在run中调用了。

如果非要声明determ型的话run部分就要改成。
clauses
run():-
console::init(),
fyl::primes(100,List),
stdIO::write("The SuShu list (bubblesort) is: ",List),
stdIO::nl.
run():-
stdIO::write("Fail"),
stdIO::nl.