标签: prolog

七周后七种语言的Prolog存在错误

我只是关注七周七语言一书.

我已经使用命令在我的Mac机器上安装了gprolog port install gprolog-devel并运行了第一个prolog代码.

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).
Run Code Online (Sandbox Code Playgroud)

如果我输入likes(wallace, cheese).prolog解释器,我就有错误

未捕获的异常:错误(exist_error(procedure,likes/2),top_level/0).

Prolog 1.3.1无法安装在我的Mac上,我正在使用prolog 1.4.0.

prolog

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

`memberd/2`的更多确定性?

许多系统提供了纯粹而有效的实现member/2.特别是,没有选择点可供选择:

?- member(b,[a,b]).
true.
Run Code Online (Sandbox Code Playgroud)

然而,member/2生产的天真实施相当:

?- member(b,[a,b]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)

从声明的角度来看肯定是正确的,但效率较低.

另一方面,存在一些技术问题member/2.它允许冗余解决方案,如:

?- member(a,[a,a]).
true ;
true.
Run Code Online (Sandbox Code Playgroud)

memberd/2使用if_/3和解决这个问题(=)/3.

memberd(E, [X|Xs]) :-
   if_(E = X, true, memberd(E, Xs)).

?- memberd(a,[a,a]).
true.
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个定义使选择点再次打开 - ; false在成员不这样做的情况下产生("剩余的选择点"):

?- memberd(X,[a,b]).
X = a ;
X = b ;
false.    % BAD - to be avoided!

?- member(X,[a,b]).
X = a ;
X = b.
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否有一个定义memberd/2,避免选择点如上所述?

list prolog

27
推荐指数
3
解决办法
358
查看次数

WAM的替代品

我记得有一次读到至少有两个与WAM同时发明的其他替代品.有什么指针吗?

prolog warren-abstract-machine

26
推荐指数
3
解决办法
2360
查看次数

Visual Prolog中的"不相等"标志?

我在Visual Prolog中找不到任何关于"不等于"标志的文档.请提供此问题的正确解决方案:

class predicates
        sister : (string Person, string Sister) nondeterm(o,o).
    clauses
        sister(Person, Sister) :-
            Person [not-equal-sign] Sister,
            parent(Person, Parent),
            parent(Sister, Parent),
            woman(Sister).
Run Code Online (Sandbox Code Playgroud)

equals prolog clause visual-prolog

26
推荐指数
2
解决办法
8万
查看次数

逻辑编程的最佳用途是什么?

逻辑编程我指的是声明性编程语言的子范例.不要混淆这个问题和"如果 - 那么其他什么问题可以解决?"

像Prolog这样的语言非常吸引人,为了学习而值得学习,但我不得不想知道哪种类型的现实问题最能用这种语言表达和解决.还有更好的语言吗?在更流行的编程语言中,逻辑编程是否存在另一个名称?这个答案的愤世嫉俗版本是Python Paradox的一个变种吗?

logic functional-programming prolog logic-programming

25
推荐指数
6
解决办法
1万
查看次数

Prolog - ASSERT和RETRACT

我想知道,我知道你可以assert用来添加事实或规则,或者如果你已经声明了谓词-:dynamic,但是这只允许在那个会话中保留所做的更改,例如,如果你关闭了Prolog窗口然后数据库更改丢失.

所以我想知道,有没有办法使它assertretract谓词可以对Prolog .pl文件进行永久性更改?

谢谢

prolog prolog-assert

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

Datalog vs CLIPS vs Prolog

和许多程序员一样,我在大学里学过Prolog,但只是很少.我知道Prolog和Datalog密切相关,但Datalog更简单吗?另外,我相信我读到Datalog不依赖于逻辑子句的排序,但我不确定为什么这是优点.据说CLIPS完全不同,但对我来说理解太微妙了.有人可以提供其他语言的一般语言亮点吗?

prolog logic-programming clips datalog

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

如何在SWI-Prolog中创建事实?

我只是想创造类似的东西:like(x,y).我已经尝试了很长时间而且真的很沮丧,有人可以告诉我该怎么做??? !!!

prolog

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

Haskell的类型系统和逻辑编程 - 如何将Prolog程序移植到类型级别

我试图理解逻辑编程语言(在我的例子中是Prolog)和Haskell的类型系统之间的关系.

我知道两者都使用统一和变量来根据关系查找值(或类型,在Haskell的类型系统中).作为练习更好地理解它们之间的相似点和不同点的练习,我尝试在Haskell的类型级别中重写一些简单的prolog程序,但是我遇到了一些问题.

首先,我重写了这个简单的prolog程序:

numeral(0).
numeral(succ(X)) :- numeral(X).

add(0,Y,Y).
add(succ(X),Y,succ(Z)) :- add(X,Y,Z).
Run Code Online (Sandbox Code Playgroud)

如:

class Numeral a where
    numeral :: a
    numeral = u

data Zero
data Succ a

instance Numeral Zero
instance (Numeral a) => Numeral (Succ a)

class (Numeral a, Numeral b, Numeral c) => Add a b c | b c -> a where
    add :: b -> c -> a
    add = u

instance (Numeral a) => Add a Zero a
instance (Add x y z) => Add …
Run Code Online (Sandbox Code Playgroud)

haskell type-systems prolog logic-programming

25
推荐指数
2
解决办法
2450
查看次数

将任意大小的整数从Prolog传递到C.

现在,我正在学习如何使用C代码连接SICStus Prolog.

我想在SICStus Prolog版本4中使用/使用/查看任意大小的整数的"汉明重量"的C实现.

在我看来,我需要C函数来测试术语类型(SP_is_integer)和C函数来访问Prolog术语(SP_get_integer,SP_get_integer_bytes).

但是,我不确定如何以便携,健壮的方式使用SP_get_integer_bytes.你能指点一些精心设计的C代码做到这一点吗?

c prolog ffi sicstus-prolog integer-arithmetic

25
推荐指数
1
解决办法
382
查看次数