标签: logic-programming

为什么我不能在prolog中得到斑马拼图的答案?

这是我目前的代码,我正在努力解决斑马拼图.

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它也会这样做

logic prolog logic-programming zebra-puzzle

3
推荐指数
1
解决办法
3306
查看次数

Prolog:对称规则

我正在按照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)

prolog logic-programming

3
推荐指数
1
解决办法
309
查看次数

这种声明式I/O方法有什么问题

我不确定这与"程序语言设计"相反的"编程"究竟有多少.但问题是:

说,为了简单起见,我们有两个'特殊'列表/数组/向量/为了简单我们只称为'端口',一个叫做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

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

java的Prime编号程序

我是编程新手,需要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

java primes numbers logic-programming

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

逻辑编程 - 只有一个功能符号的子集图灵 - 完成?

如果我有一个只包含一个功能符号的逻辑编程子集,我能做什么吗?

我想我不能,但我不确定.如果编程语言是图灵完备语言,它可以做任何用户想要的事情.我被告知这意味着它必须能够执行if..then..else命令,递归和自然数应该被定义.

任何帮助和意见将不胜感激!

prolog logic-programming subset turing-complete

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

如何在Prolog中实现自己的列表?

我正在学习Prolog,我知道有一个数据结构已经实现来处理列表,但我想知道,如果由于某种原因我想实现自己的数据结构,我该怎么做?我不希望将实现作为答案,但有些想法会很棒.

谢谢.

logic list prolog logic-programming

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

Curry 中的 N-ary 函数和 Prolog 中的 N+1-ary 关系有什么区别吗?

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

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

定理证明者中的归纳证明(Z3、Vampire、具有 TPTP 语法)

我正在使用 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)

logic logic-programming theorem-proving smt z3

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

Prolog:X是Y的祖父

假设已将以下事实输入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)

prolog logic-programming

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

帮助prolog的条款

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 logic-programming

0
推荐指数
1
解决办法
290
查看次数

Prolog将列表中的所有元素相乘

我想在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.

请帮忙.

prolog logic-programming

0
推荐指数
1
解决办法
3598
查看次数