我只是关注七周七语言一书.
我已经使用命令在我的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.
许多系统提供了纯粹而有效的实现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,避免选择点如上所述?
我在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) 逻辑编程我指的是声明性编程语言的子范例.不要混淆这个问题和"如果 - 那么其他什么问题可以解决?"
像Prolog这样的语言非常吸引人,为了学习而值得学习,但我不得不想知道哪种类型的现实问题最能用这种语言表达和解决.还有更好的语言吗?在更流行的编程语言中,逻辑编程是否存在另一个名称?这个答案的愤世嫉俗版本是Python Paradox的一个变种吗?
我想知道,我知道你可以assert用来添加事实或规则,或者如果你已经声明了谓词-:dynamic,但是这只允许在那个会话中保留所做的更改,例如,如果你关闭了Prolog窗口然后数据库更改丢失.
所以我想知道,有没有办法使它assert和retract谓词可以对Prolog .pl文件进行永久性更改?
谢谢
和许多程序员一样,我在大学里学过Prolog,但只是很少.我知道Prolog和Datalog密切相关,但Datalog更简单吗?另外,我相信我读到Datalog不依赖于逻辑子句的排序,但我不确定为什么这是优点.据说CLIPS完全不同,但对我来说理解太微妙了.有人可以提供其他语言的一般语言亮点吗?
我只是想创造类似的东西:like(x,y).我已经尝试了很长时间而且真的很沮丧,有人可以告诉我该怎么做??? !!!
我试图理解逻辑编程语言(在我的例子中是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) 现在,我正在学习如何使用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代码做到这一点吗?