标签: prolog

如何使用Java中的Prolog?

在Java/Eclipse应用程序的上下文中,我想将Prolog用于特定任务.有哪些可用的解决方案和工具,以及相关的利弊?

我可以启动外部Prolog解释器生成文件中的结果?我可以使用完整的Prolog Java Library(用java实现的Prolog解释器)?我可以使用专用于与外部Prolog解释器通信的java库吗?

在此先感谢您的帮助,

马努

java prolog

14
推荐指数
3
解决办法
2万
查看次数

将查询的所有结果放在Prolog的列表中

我想知道如何创建一个谓词,将所有结果从一些查询中获取(所以我得到一个结果并按分号直到我得到False)在列表中.

例如,如果我foo(X,[1,2,3]).在一些Prolog听众中写,假设结果是

X=[11];
X=[22];
False.
Run Code Online (Sandbox Code Playgroud)

我想把所有这些结果都列在一个列表中,所以会发生类似下面的事情.

?-another_foo(X,[1,2,3]).
X=[[11],[22]].
Run Code Online (Sandbox Code Playgroud)

another_foo会以某种方式使用foo创建一个包含foo所有结果的列表.我只是不知道如何.

prolog

14
推荐指数
1
解决办法
9167
查看次数

Einsteins Riddle Prolog

我的AI课程需要一些prolog作业的帮助.问题是要为爱因斯坦的谜题编写序言代码.我知道如何把它写下来,但是在作业中有一些限制.

 there are 5 houses
 the Englishman lives in the red house
 the Spaniard owns the dog
 coffee is drunk in the green house
 the Ukrainian drinks tea
 the green house is immediately to the right of the ivory house
 the Old Gold smoker owns snails
 Kools are smoked in the yellow house
 milk is drunk in the middle house
 the Norwegian lives in the first house
 the man who smokes Chesterelds lives in the house next to the man …
Run Code Online (Sandbox Code Playgroud)

logic artificial-intelligence prolog zebra-puzzle

14
推荐指数
2
解决办法
1万
查看次数

在Prolog中实现"最后"

我试图通过阅读Ulle Endriss的讲义来了解Prolog编程.当我对练习的解决方案没有达到预期的效果时,我发现很难给出一个很好的解释.我认为这与我对Prolog评估表达式的方式的不稳定理解有关.

第20页的练习2.6调用谓词的递归实现,该谓词的last1行为类似于内置谓词last.我的尝试如下:

last1([_ | Rest], Last) :- last1(Rest, Last).
last1([Last], Last).
Run Code Online (Sandbox Code Playgroud)

它给出了正确的答案,但对于具有多个元素的列表,我必须键入分号才能终止查询.这last1与内置的不同last.

?- last1([1], Last).
Last = 1.

?- last1([1, 2], Last).
Last = 2 ;
false.
Run Code Online (Sandbox Code Playgroud)

如果我切换我声明规则和事实的顺序,那么我需要在两种情况下键入分号.

我想我知道为什么Prolog认为last1可能还有一个解决方案(因此是分号).我想它遵循评估顺序

last1([1, 2], Last).
==>  last1([2], Last).
==>  last1([], Last).    OR    Last = 2.
==>  false    OR    Last = 2.
Run Code Online (Sandbox Code Playgroud)

这似乎表明我应该寻找一种方法来避免匹配Rest[].无论如何,我没有解释为什么切换声明的顺序应该有任何影响.

问题1: 对行为的正确解释是last1什么?

问题2: 如何实现last1与内置无法区分的谓词last

list prolog prolog-toplevel

14
推荐指数
2
解决办法
8548
查看次数

立即学习Prolog!运动解决方案

有谁知道我在哪里可以找到练习的解决方案和现在学习Prolog的实践课程?我开始研究它,并将验证我设计的答案.

prolog

13
推荐指数
2
解决办法
1万
查看次数

Prolog在尝试使用时给出错误"未定义的过程": -

我在Windows上使用SWI-Prolog并收到以下错误:

14 ?- parent(X, Y) :- child(Y, X).
ERROR: toplevel: Undefined procedure: (:-)/2 (DWIM could not correct)
Run Code Online (Sandbox Code Playgroud)

我不完全确定发生了什么,因为这上周工作,我刚开始学习Prolog.

prolog prolog-toplevel

13
推荐指数
2
解决办法
3万
查看次数

Prolog的序幕?

如果您定期编写Prolog程序,您可能拥有自己依赖的谓词库.一些Prolog系统带有丰富的预定义谓词,有些则没有.有些系统有库,但它们与其他系统大多不兼容.此外,许多现有的库包含许多很少需要的谓词.但是,有一些谓词"应该"始终存在.然后,有一些进展,因为十一月发生这样Cor.2(草案).为什么不在这里呢?

那么你最喜欢的谓词是什么?这是谓词,在ISO核心中没有定义.

首先:between/3,member/2,length/2,dif/2,maplist/2,...

对于DCG中:seq//1,iseq//1,... //0.


编辑: Prolog序言的初稿可以在这里找到!
编辑:如果您希望重新打开此问题,请投票重新打开,但也有助于重新制定问题,使其不会再次关闭.

iso prolog dcg iso-prolog

13
推荐指数
1
解决办法
643
查看次数

我应该避免Prolog中的尾递归吗?

我正在通过"现在学习Prolog"在线书籍来获取乐趣.

我正在尝试编写一个谓词,该谓词遍历列表的每个成员并使用累加器向其中添加一个谓词.我已经很容易做到了,没有尾递归.

addone([],[]).
addone([X|Xs],[Y|Ys]) :- Y is X+1, addone(Xs,Ys).
Run Code Online (Sandbox Code Playgroud)

但我已经读过,出于性能原因,最好避免这种类型的递归.这是真的?总是使用尾递归被认为是"好习惯"吗?是否值得努力使用累加器来养成良好的习惯?

我试图将此示例更改为使用累加器,但它会反转列表.我怎么能避免这个?

accAddOne([X|Xs],Acc,Result) :- Xnew is X+1, accAddOne(Xs,[Xnew|Acc],Result).
accAddOne([],A,A).
addone(List,Result) :- accAddOne(List,[],Result).
Run Code Online (Sandbox Code Playgroud)

tail-recursion prolog accumulator tailrecursion-modulo-cons

13
推荐指数
2
解决办法
5151
查看次数

SWI-Prolog中的面向对象编程

我在某处读到你可以将模块视为Prolog中的对象.我试图解决这个问题,如果这是一个很好的编码方式.

如果我有两个文件,一个定义一个类狗,然后另一个使用这个类来生成两个狗对象.

:- module(dog,
      [ create_dog/4,bark/1 ]).

create_dog(Name,Age,Type,Dog):-
   Dog = dog(name(Name),age(Age),type(Type)).

bark(Dog):-
   Dog = dog(name(_Name),age(_Age),type(Type)),
   Type = bassethound,
   woof.
bark(Dog):-
   Dog = dog(name(_Name),age(_Age),type(Type)),
   Type \= bassethound,
   ruff.

woof:-format("woof~n").

ruff:-format("ruff~n").
Run Code Online (Sandbox Code Playgroud)

第二个档案

use_module(library(dog)).

run:-
   dog:create_dog('fred',5,bassethound,Dog),
   forall(between(1,5,_X),
       dog:bark(Dog)
      ),
   dog:create_dog('fido',6,bloodhound,Dog2),
   dog:bark(Dog2).
Run Code Online (Sandbox Code Playgroud)

这使得一只狗对象Dog是一只巴塞特猎犬并且让它吠5次,然后我再制作另一只狗对象Dog2,它是一只猎犬并使它也吠叫.我知道在oop中你有对象有行为和状态.所以我现在根据自己的状态有两个具有不同行为的对象,但目前我将对象的状态存储在Dog变量中,主程序中的代码可以看到它们.有没有办法隐藏对象的状态,即拥有私有变量?例如,我可能希望有一种方法可以为每个狗对象存储状态has_barked,如果它在程序中较早出现,则为true,否则为false,然后bark/1根据此更改行为.

您还将如何处理继承和覆盖方法等?任何指向读数的指针都欢迎.谢谢.

oop module object prolog swi-prolog

13
推荐指数
2
解决办法
2898
查看次数

为什么高优先级运算符的原子不需要圆括号?

在较旧的教科书1中,经常遇到如下的操作员声明:

?- op(1200,fx,(:-)).
              ^  ^
Run Code Online (Sandbox Code Playgroud)

过去,这些圆括号是必要的.但今天,他们不再需要了:

| ?- writeq(op(1200,fx,(:-))).     
op(1200,fx,:-)
Run Code Online (Sandbox Code Playgroud)

为什么不再需要它们?标准如何应对这种情况?


1 p.97 6. MU-Prolog 3.2db参考手册的标准操作员声明,出现在Prolog的否定和控制中,Lee Naish,LNCS 238,Springer-Verlag 1985.

syntax operators prolog iso-prolog

13
推荐指数
2
解决办法
290
查看次数