Prolog101(04)

数学计算:
X is <数学表达式> 

数学运算:
+-*/
()

比较运算:
X > Y 
X < Y 
X >= Y 
X =< Y  
1 ?- X is 1*2+3/4-(5-6)*7.
X = 9.75.

2 ?- 3=<4.
true.

3 ?- 3>=4.
false.

4 ?- 3>4.
false.

5 ?- 3<4.
true.

6 ?- X is 2+2, 3>=X.  
false.

看一下摄氏度与华氏度互转的程序:

%swipl -s calc.pl
%Hansen

c_to_f(C,F) :- F is C*9/5+32.
f_to_c(F,C) :- C is (F-32)*5/9.
1 ?- c_to_f(11,F).
F = 51.8.

2 ?- f_to_c(51.8,F).
F = 10.999999999999998.

Prolog101(03)

1、常用输出函数:

write:把它的参数作为字符串输出到屏幕上。
从Call端口调用时总是成功的,从Redo端口回溯时总是失败的。

nl:在屏幕上输出一个回车符。
从Call端口调用时总是成功的,从Redo端口回溯时总是失败的。

tab:输出n个空格,n为它的参数(整数)。
从Call端口调用时总是成功的,从Redo端口回溯时总是失败的。

2、启用调试

?- debug.

3、and,or,not
and:两个条件之间,用“,”分割
or:两个条件之间,用“;“分割
not:我使用的版本中,有not函数
比如,下面的例子中,like(X):-(fruit(X);vegetable(X)),not(meat(X)),not(hate(X)).:
panpan喜欢吃的食物逻辑为:
a、喜欢蔬菜和水果
b、不喜欢吃肉
c、有些蔬菜不喜欢
d、其余不喜欢

%swipl -s fruit.pl
%Hansen

%and(A,B):- A, B.
%or(A,B):- A; B.
%not(A):- call(A), !, fail.

like(X):-(fruit(X);vegetable(X)),not(meat(X)),not(hate(X)).

fruit(apple).
fruit(grape).
fruit(pear).

meat(pork).
meat(mutton).
meat(beef).

vegetable(tomato).
vegetable(cabbage).
vegetable(spinach).
vegetable(celery).

hate(celery).

所以,panpan不喜欢羊肉,喜欢大白菜,但不喜欢芹菜

1 ?- like(mutton).
false.

2 ?- like(cabbage).
true.

3 ?- like(celery).
false.

Prolog101(02)

通过上一章,大家可以知道,prolog是根据初始数据+逻辑规则,来进行逻辑判断一门语言。
程序员的重点,从如何进行逻辑判断,变成了如何制定逻辑规则。

我们了解一下prolog的一些基础知识:

% swipl -s hello.pl
% author neohope
 
%输入数据,like左边是人,右边是爱好
%请注意"."
like(wangwu,fishing).
like(wangwu,smoking).
like(wangwu,binglang).
 
like(jiliang,riding).
like(jiliang,smoking).
like(jiliang,soccer).
 
like(guosir,soccer).
 
like(linlin,riding).
like(linlin,smoking).
 
like(zhaowen,smoking).
 
like(hansen,sleep).
 
%描述关系:如果路人甲X,与路人乙Y,同时喜欢一种项目时Z,他们可以一起玩(paly)
%请注意"."
play(X,Y):-like(X,Z),like(Y,Z).

1、参数,参数可以是以下四种之一:
整数(integer):绝对值小于某一个数的正数或负数。
原子(atom):由小写字母开头的字符串。
变量(variable):由大写字母或下划线(_)开头。
结构(structure):在以后的章节介绍。
可用字符:A-Z;a-z;0-9;+-/\^,.~:.?#$等。

如:wangwu,fishing两个都是参数

2、谓词(predicate):Prolog语言的基本组成元素,可以是一段程序、一个数据类型或者是一种关系。
它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。

如:like(arg1,arg2)只是一个谓词,like是谓词名,arg1,arg2是参数。

3、事实(facts):prolog中最简单的谓词。类似于关系数据库中的记录。

如:like(wangwu,fishing).这就是一个事实,wangwu喜欢钓鱼。

4、目标(goal):Prolog的查询工作是靠模式匹配完成的,查询的模板叫做目标。
如果有某个事实与目标匹配,那么查询就成功了,Prolog的解释器会回显’true.’。
如果没有匹配的事实,查询就失败了,解释器回显’false.’。

5、联合(unification):Prolog的模式匹配工作称为联合。
当数据库中只包括事实时,以下三个条件是使联合成功的必要条件。
a、目标谓词名与数据库中的某个谓词名相同。
b、这两个谓词的参数数目相同。
c、所有的参数也相同。

如:?- like(wangwu,riding).这个查询,因为没有like(wangwu,riding)这个事实,返回false。

6、绑定(binding):在使用带有变量的查询时(首字母大写),使用变量可以和任何的条目匹配。
联合成功之后,变量的值将和它所匹配的条目的值相同,这叫做变量的绑定。
当带变量的目标成功的和数据库中的事实匹配之后,Prolog将返回变量绑定的值。

如:?- like(wangwu,X).会返回wangwu喜欢的所有项目。

7、端口:Prolog的目标有四个端口用来控制运行的流程:调用(call)、退出(exit)、重试(redo)以及失败(fail)。
每个端口的功能如下:
call 开始使用目标搜寻子句。
exit 目标匹配成功,在成功的子句上作记号,并绑定变量。
redo 试图重新满足目标,首先释放变量,并从上次的记号开始搜索。
fail 表示再找不到更多的满足目标的子句了。

一开始使用Call端口进入目标,如果匹配成功就到了exit端口,如果失败就到了fail端口,如果用户输入分号,则又从redo端口进入目标。

8、规则:储存起来的查询。它的语法如下:head :- body,其中,
head 是谓词的定义部分,与事实一样,也包括谓词名和谓词的参数说明。
:- 连接符,一般可以读作‘如果’。
body 一个或多个目标。

如:play(X,Y):-like(X,Z),like(Y,Z).
head:play(X,Y)
:-
body:这个body有两个目标,like(X,Z),like(Y,Z)
规则名:play/2
描述:如果路人甲X,与路人乙Y,同时喜欢一种项目时Z,他们可以一起玩(paly)

Prolog101(01)

最近看了下prolog,整理如下:

比起c,java,C#来,prolog与sql的逻辑更相似一些:
a、输入初始数据(sql建表,及表中数据输入)
b、描述关系(sql存储过程)
c、进行查询(查询表,调用存储过程)
d、只需要告诉prolog,需要查什么,不关心如何去查询(比如sql如何查找数据,是db服务器的问题,我们一般不关心如何具体实现)

比如,首先进行a,b两步:

% swipl -s hello.pl
% author neohope

%输入数据,like左边是人,右边是爱好
%请注意"."
like(wangwu,fishing).
like(wangwu,smoking).
like(wangwu,binglang).

like(jiliang,riding).
like(jiliang,smoking).
like(jiliang,soccer).

like(guosir,soccer).

like(linlin,riding).
like(linlin,smoking).

like(zhaowen,smoking).

like(hansen,sleep).

%描述关系:当路人甲X,与路人乙Y,同时喜欢一种项目时Z,他们可以一起玩(paly)
%请注意"."
play(X,Y):-like(X,Z),like(Y,Z).

然后进行查询:

%查询wangwu,喜欢的项目
%请注意".",";"要手工输入
1 ?- like(wangwu,X).
X = fishing ;
X = smoking ;
X = binglang.

%查询喜欢riding项目的人
%请注意".",";"要手工输入
2 ?- like(X,riding).
X = jiliang ;
X = linlin.

%查询,jiliang与lilin是否喜欢一起玩
3 ?- play(jiliang,linlin).
true .

%查询,jiliang与hansen是否喜欢一起玩
4 ?- play(jiliang,hansen).
false.

%为什么呢?查一下hansen喜欢什么运动
5 ?- like(hansen,X).
X = sleep.
%原来他只喜欢睡觉^_^,不喜欢运动,当然没人和他玩咯

有些概念没?那咱们进入下一章。

.Net4的WinForm程序使用.Net2控件

在.Net4的WinForm程序中,混用.Net2控件会报下面的问题

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

解决方法为在App.config文件中,增加以下配置

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

八后问题Ruby02

Queen.rb

class Queen
  
  def initialize()
    @v=0
  end
  
  def canSetQueen(lst,s,x,y)
      lstNo = Array.new()
    
      for i in 0..s-1 do
        p = Pt.new(x,i)
        lstNo.push(p)
      end
      
      for j in 0..s-1 do
        p = Pt.new(j,y)
        lstNo.push(p)
      end 
      
      x0=x
      y0=y
      while x0<s and y0<s
        p=Pt.new(x0,y0)
        lstNo.push(p)
        x0=x0+1
        y0=y0+1
      end
      
      x0=x
      y0=y
      while x0>=0 and y0>=0
        p=Pt.new(x0,y0)
        lstNo.push(p)
        x0=x0-1
        y0=y0-1
      end
      
      x0=x
      y0=y
      while x0>=0 and y0<s
        p=Pt.new(x0,y0)
        lstNo.push(p)
        x0=x0-1
        y0=y0+1
      end
      
      x0=x
      y0=y
      while x0<s and y0>=0
        p=Pt.new(x0,y0)
        lstNo.push(p)
        x0=x0+1
        y0=y0-1
      end
      
      while(lstNo.length>0)
        p=lstNo.pop
        if(p.y==lst[p.x])
          return false
        end
      end
      
      return true
  end
    
  def findQueen(lst,s,x) 
      
      if(x>=s)
        @v=@v+1
        puts("]>>solution No."+@v.to_s)
        pp lst
        return
      end
      
      for y in 0..s-1 do
        if(canSetQueen(lst,s,x,y))
          lst.push(y)   
          findQueen(lst,s,x+1)
          lst.pop
        end
      end
       
    end
end

class Pt
  attr_accessor:x
  attr_accessor:y
  def initialize(x,y)
      @x=x
      @y=y
  end
end

test.rb

require "pp"
require "./Queen.rb"

len = 8
lst = Array.new()

q=Queen1.new
q.findQueen(lst,len,0)

puts("end")

八后问题Ruby01

Queen.rb

class Queen
  
  def initialize()
    @v=0
  end
  
  def arrCopy2(arr)
    arr0=Array.new(arr.length)
    for i in 0..arr.length-1 do
      arr0[i]=Array.new(arr[i])
    end
    
    return arr0
  end
  
  def addQueen(arr,x,y)
    setQueen(arr,x,y,1)
  end
  
  def setQueen(arr,x,y,n)
    for i in 0..arr.length-1 do
      arr[x][i]=n
    end
    
    for j in 0..arr[x].length-1 do
      arr[j][y]=n
    end 
    
    x0=x
    y0=y
    while x0<arr.length and y0<arr&#91;x0&#93;.length
      arr&#91;x0&#93;&#91;y0&#93;=n
      x0=x0+1
      y0=y0+1
    end
    
    x0=x
    y0=y
    while x0>=0 and y0>=0
      arr[x0][y0]=n
      x0=x0-1
      y0=y0-1
    end
    
    x0=x
    y0=y
    while x0>=0 and y0<arr&#91;x0&#93;.length
      arr&#91;x0&#93;&#91;y0&#93;=n
      x0=x0-1
      y0=y0+1
    end
    
    x0=x
    y0=y
    while x0<arr.length and y0>=0
      arr[x0][y0]=n
      x0=x0+1
      y0=y0-1
    end
    
    return arr
  end
  
  def findQueen(arr,lst,x) 
    
    if(x>=arr.length)
      @v=@v+1
      puts("]>>solution No."+@v.to_s)
      pp lst
      return
    end
    
    for y in 0..arr[x].length-1 do
      if(arr[x][y]==0)
        lst.push(y)
        arr0=arrCopy2(arr)
        addQueen(arr,x,y)   
        findQueen(arr,lst,x+1)
        arr=arr0
        lst.pop
      end
    end
     
  end
  
end

test.rb

require "pp"
require "./Queen.rb"

len = 8
arr=Array.new(len){Array.new(len, 0)}
#fuck
#arr = Array.new(len, Array.new(len,0))

lst = Array.new()

q=Queen.new
q.findQueen(arr,lst,0)

puts("end")

JAVA常用缩写

今天整理的一份文档,希望对大家有所帮助

AAA: Authentication, Authorization, Accounting

AWT: Abstract Window Toolkit (AWT VS. Swing VS. SWT)

AOP: ASPect Oriented Programming

BMP: Bean-Managed Persistent

CMP: Container-Managed Persistent

CORBA: Common Object Request Broker Architecture

DI: Dependency Injection

DTD: Document Type Definition

EJB: Enterprise Java Beans(Session Beans, Entity Beans, Message-driven Beans)

IDL: Interface Definition Language

IIOP: Internet Inter-ORB Protocol

IOC: Inversion Of Control

I18N: InternationalizationN

L10N: LocalizatioN

J2EE: Java2 Enterprise Edition(EJB, JTA, JDBC, JCA, JMX, JNDI, JMS, JavaMail, Servlet, JSP)

J2ME: Java2 Micro Edition

J2SE: Java2 Standard Edition

JAF: Java Action FrameWork

JCA: Java Cryptography Architecture

JCP: Java Community Process

JDBC: Java Data Base Connectivity

JDK: Java Development Kit

JDO: Java Data Object

JFC: Java Foundation Classes

JMS: Java Message Service

JNDI: Java Naming And Directory Interface

JNI: Java Native Interface

JPA: Java Persistence API

JRE: Java Runtime Environment

JSDK: Java Software Development Kit

JSF: Java Server Faces

JSP: Java Server Pages

JTA: Java Transaction API

JTS: Java Transaction Service

JVM: Java Virtual Machine(JRE VS. JNode VS. SableVM)

MVC: Model, View, Controller

OMG: Object Menagement Group

OCP: Open Closed Principle (Software entities should be open for extension, but closed for modification.)

OR Mapping: Object Relation Mapping

PI: Processing Instruction

PO: Persisent Object

POJO: Plain Ordinary Java Object

RADIUS: Remote Authentication Dial In User Service

RMI: Remote Method Invocation

RTTI: RunTime Type Identification

SOA: Service-Oriented Architecture

SPI: Service Provider Interface

WFC: Windows Foundation Classes for Java

WORA: Write Once, Run Anywhere

Io自学笔记01

//animal
animal := Object clone
animal name := "name"

//dog
dog := animal clone
dog name := "dog"
dog isSit := false
dog bark := method(writeln("woof"))
dog sit := method(
	if(isSit==true,writeln("sitting now");bark;return;)
	isSit=true
	writeln("sit ok")
	bark
)

//fido
fido := dog clone
fido name := "fido"
fido bark := method(
	writeln("ruf")
)

//test
writeln("dog bark>>")
dog bark
writeln("dog sit>>")
dog sit
writeln("dog sit>>")
dog sit

writeln("fido bark>>")
fido bark
writeln("fido sit>>")
fido sit
writeln("fido sit>>")
fido sit

JNI简单例子2

最近又用jni写了一个编码工具,从中抽出了最简单的代码,如下:

1、Compress4j.java

package com.neohope.test.compress.jni;

/**
 *
 * @author Hansen
 */
public class Compress4j {
    private native int encodeR(String inFilePath,String outFilePaht);
    private native int decodeR(String inFilePath,String outFilePaht);
    
    static{
        try{
            System.loadLibrary("compress4j");
        }catch(UnsatisfiedLinkError e){
            //nothing to do
            System.out.println("Error: Couldn't load compress4j");
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
    
    public String encode(String inFilePath,String outFilePath)
    {
        encodeR(inFilePath, outFilePath);
        return "xxxxx";
    }
    
    public String decode(String inFilePath,String outFilePath)
    {
        decodeR(inFilePath, outFilePath);
        return "xxxxx";
    }
}

2、找到生成的classes文件夹,运行命令行:

javah -classpath . -jni com.neohope.test.compress.jni.Compress4j 

3、生成的.h文件如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_neohoe_test_compress_jni_Compress4j */

#ifndef _Included_com_neohoe_test_compress_jni_Compress4j
#define _Included_com_neohoe_test_compress_jni_Compress4j
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_neohoe_test_compress_jni_Compress4j
 * Method:    encodeR
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_encodeR
  (JNIEnv *, jobject, jstring, jstring);

/*
 * Class:     com_neohoe_test_compress_jni_Compress4j
 * Method:    decodeR
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_decodeR
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

3、编写成的.cc文件如下

#include "com_neohoe_test_compress_jni_Compress4j.h"

JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_encodeR
  (JNIEnv *env, jobject, jstring inpathjs, jstring outpathjs)
{
    //first convert jstring to const char*
    const char* inpath = env->GetStringUTFChars( inpathjs, false);
    const char* outpath = env->GetStringUTFChars( outpathjs, false);

    //...

    return 0;
}

JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_decodeR
  (JNIEnv *env, jobject, jstring inpathjs, jstring outpathjs)
{
    //first convert jstring to const char*
    const char* inpath = env->GetStringUTFChars( inpathjs, false);
    const char* outpath = env->GetStringUTFChars( outpathjs, false);

    //...

    return 0;
}

4、在VS工程中,新增头文件目录
%JAVA_HOME%/include
%JAVA_HOME%/include/win32

5、编译为dll即可使用啦

6、关于mt和md的问题
编译为MT和MTd的话,用JNI是没有任何问题的
编译为MD的话,需要安装VC2010sp1可再发行包
编译为MDd的话,就比较麻烦了,手动复制依赖的dll后,我用c++调用dll可以成功,但用jni就一直提示:缺少依赖的dll