这是我目前的代码,我正在努力解决斑马拼图.
exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).
rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).
middleHouse(A,(_,_,A,_,_)).
firstHouse(A,(A,_,_,_,_)).
nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).
:- Houses = (house(N1,P1,S1,D1,C1),house(N2,P2,S2,D2,C2),house(N3,P3,S3,D3,C3),house(N4,P4,S4,D4,C4),house(N5,P5,S5,D5,C5)),
exists(house(english,_,_,_,red),Houses),
exists(house(spainish,dog,_,_,_),Houses),
exists(house(_,_,_,coffee,green),Houses),
exists(house(ukrainian,_,_,tea,_),Houses),
rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
exists(house(_,dog,oldgold,_,_),Houses),
exists(house(_,_,kools,_,yellow),Houses),
middleHouse(house(_,_,_,milk,_),Houses),
firstHouse(house(norwegian,_,_,_,_),Houses),
nextTo(house(_,_,chesterfields,_,_),house(_,fox,_,_,_),Houses),
nextTo(house(_,_,kools,_,_),house(_,horse,_,_,_),Houses),
exists(house(_,_,luckystike,orangejuice,_),Houses),
exists(house(japanise,_,parliments,_,_),Houses),
nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
exists(house(WaterDrinker,_,_,water,_),Houses),
exists(house(ZebraOwner,zebra,_,_,_),Houses).
Run Code Online (Sandbox Code Playgroud)
我输入了它并将其保存为zebra.pl,我打开它并将[zebra]输入SWI-prolog,它返回一个关于单例使用N1,P1,C1等的警告消息并返回true,然后我要求它使用print(WaterDrinker)打印饮水器并返回_G317并且为true,
为什么它这样做并且没有返回可能是挪威语的答案,如果我要求它返回任何变量如C3或ZebraOwner它也会这样做
我正在按照Prolog教程要求定义对称关系.
比如说你在知识库中有以下事实:
colleague(john,bob).
Run Code Online (Sandbox Code Playgroud)
你也希望同事(鲍勃,约翰)是真实的,同样也适用于所有同事的事实.
该教程说要使用以下规则......
colleague(X,Y) :- colleague(Y,X).
Run Code Online (Sandbox Code Playgroud)
但是当我使用以下查询时执行此操作时会出现问题...
| ? - colleague(john,X).
X = bob ? ;
X = bob ? ;
X = bob ? ;
X = bob ? ;
...
| ? - colleague(bob,X).
X = john ? ;
X = john ? ;
X = john ? ;
X = john ? ;
...
Run Code Online (Sandbox Code Playgroud)
我想我明白为什么会这样 - 规则是无限递归的?但是我遇到了修复它的问题.这就是我要的...
| ? - colleague(john,X).
X = bob ? ;
no
| ? - colleague(bob,X).
X = john ? …Run Code Online (Sandbox Code Playgroud) 我不确定这与"程序语言设计"相反的"编程"究竟有多少.但问题是:
说,为了简单起见,我们有两个'特殊'列表/数组/向量/为了简单我们只称为'端口',一个叫做stdIn另一个stdOut.这些概念上分别代表
在Haskell启发的伪代码中,应该可以创建这个完全声明性的程序:
let stdOut = ["please input a number",
"and please input another number",
"The product of both numbers is: " ++ stdIn[0] * stdIn[1]]
Run Code Online (Sandbox Code Playgroud)
哪个会做到预期,要求两个数字,并打印他们的产品.诀窍是stdOut表示在程序完成时写入终端的字符串列表,stdIn是输入字符串列表.键入错误以及需要一些安全措施才能在输入新行后仅打印下一行这一事实为了简单起见而留在这里,它可能很容易解决.
所以,在我实施这个想法之前,我忽略了它有什么陷阱吗?我不知道已经存在类似的结构,所以不考虑我忽略了一个明显的陷阱是天真的.
否则,我当然知道:
let stdOut = [stdIn[50],"Hello, World!"]
Run Code Online (Sandbox Code Playgroud)
如果这些结果需要以与上述类似的方式交织,那将是一个错误.
functional-programming side-effects logic-programming declarative-programming
我是编程新手,需要java程序的帮助.我希望我的程序返回1到10之间的所有素数.
for(int i=1; i<=10; i++){
int factors = 0;
int j=1;
while(j<=i){
if(i % j == 0){
factors++;
}
j++;
}
if(factors==2){
System.out.println(j);
}
}
Run Code Online (Sandbox Code Playgroud)
我没有收到2,3,5和7,而是收到3,4,6和8
如果我有一个只包含一个功能符号的逻辑编程子集,我能做什么吗?
我想我不能,但我不确定.如果编程语言是图灵完备语言,它可以做任何用户想要的事情.我被告知这意味着它必须能够执行if..then..else命令,递归和自然数应该被定义.
任何帮助和意见将不胜感激!
我正在学习Prolog,我知道有一个数据结构已经实现来处理列表,但我想知道,如果由于某种原因我想实现自己的数据结构,我该怎么做?我不希望将实现作为答案,但有些想法会很棒.
谢谢.
Curry与它的堂兄 Haskell 不同,它允许您为一个函数赋予多个值:
foo 1 2 = 3
foo 1 2 = 4
Run Code Online (Sandbox Code Playgroud)
它确实回溯(或其他一些搜索)来探索这种非确定性的影响。
这使它类似于 Prolog(特别是?Prolog由于类型系统和语法),您可以在其中声明
foo 1 2 3.
foo 1 2 4.
Run Code Online (Sandbox Code Playgroud)
在语义上,N 元Curry 函数和N+1 元Prolog 关系之间有什么区别吗?
functional-programming prolog logic-programming curry lambda-prolog
我正在使用 TPTP 语法测试一些定理证明器(例如 Z3、Alt-Ergo、Vampire 等)的归纳能力。令我惊讶的是,他们都没有能够证明以下简单的猜想:
tff(t1, type, (fun: $int > $int )).
tff(ax1, axiom, (
! [A: $int] : (
$less(A, 1) => (fun(A) = 123)
)
)).
tff(ax2, axiom, (
! [A: $int] : (
$greatereq(A, 1) => (fun(A) = fun($difference(A, 1)))
)
)).
tff(conj1, conjecture, ! [A: $int] : ($greatereq(A, 1) => (fun(A) = 123))).
% END OF SYSTEM OUTPUT
% RESULT: SOT_EWCr1V - Z3---4.8.9.0 says Timeout - CPU = 60.09 WC = 35.47
% OUTPUT: SOT_EWCr1V - …Run Code Online (Sandbox Code Playgroud) 假设已将以下事实输入Prolog数据库:
father(X, Y) // X is the father of Y
mother(X, Y) // X is the mother of Y
male(X) // X is a male
female(X) // X is a female
parent(X, Y) // X is a parent of Y
diff(X, Y) // X and Y are different
Run Code Online (Sandbox Code Playgroud)
(1)现在为grandpa_of(X,Y)添加一个Prolog规则,其中"X是Y的祖父"
(2)为兄弟(X,Y)添加另一条规则,其中"X是Y的兄弟姐妹"
我的想法:
问题1:
我对如何找到父母的父母感到困惑,到目前为止我都是
grandpa_of(X,Y): - 男(X),...
问题2:
兄弟(X,Y): - 父(P,X),父(P,Y),差异(X,Y)
emissionOf(alpha).
emissionOf(beta).
detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,某些(可能是显而易见的)原因Prolog不接受上述代码的最后一行.原因与以下内容有关:
detected(proton), detected(electron)
Run Code Online (Sandbox Code Playgroud)
如果我试试
detected(proton)
Run Code Online (Sandbox Code Playgroud)
它行为正确.
问题是什么?我试图说明,如果同时存在α和β的发射,则存在质子和电子的检测.
谢谢
我想在Prolog中定义一个谓词,prod_list/2将列表的每个元素相乘.我有空列表的问题希望产品应该为零,而我得到假.我的代码是
prod_list([H], H).
prod_list([H|T], Product) :- prod_list(T, Rest),
Product is H * Rest.
Run Code Online (Sandbox Code Playgroud)
我得到的结果是prod_list([4,3],Product). - > Product = 12但是当我做prod_list([],Product)时.我得到假而不是Product = 0.
请帮忙.